소스를 보면 다음과 같다.



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

메모 기록용 공간

,