ipwn

[LOB(Lord Of Buffer overflow)] giant -> assassin 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] giant -> assassin

ipwn 2018. 1. 20. 14:53

이번 단계는 giant 단계이다.


바로 복사본을 만들고 파일들을 보겠다.



assassin 파일과 assassin.c 코드가 있다.


코드를 읽어보도록 하겠다.



코드를 보니 no stack, no RTL이라고 적혀있다.


진짜로 library영역을 막아버렸고, stack영역도 막아버렸다.


그렇다면 우리가 불러올 수 있는 영역은 code영역이 남아있다.


이번 문제는 ret sled기법을 사용하는 문제인데, 쉽게 말해서 ret을 한 번 더 호출해서 원하는 위치로 


점프 시켜버리겠다는 말이다. 


이 기법이 돌아가는 원리는 생각보다 간단하다.


ret 어셈블리어는


pop eip


jmp eip


로 이뤄진 걸 알 수 있는데 return address에 ret을 넣어주면 esp가 한 칸 그러니까 4byte가 증가되게 되고


그 위치의 값으로 jmp할 것이라는 말이다.


물론 ret ret ret ret ret ret 을 계속 하게되면 esp는 위치는 계속 증가할 것이다.


즉 우리가 넘겨줄 payload는 dummy*44 + ret gadget + &shellcode + nop + shellcode가 될 것이다.


ret gadget(ret가젯이라고 부른다.)은 찾기 굉장히 쉽다.


그냥 main함수의 ret 부분의 주소를 가져오면 된다. 코드영역이기 때문에 고정적이다.


한 번 gdb로 copy file을 디버깅해서 ret gadget를 가져와보겠다.



ret gadget의 주소를 찾았다.


ret gadget의 주소는 0x804851e이다.


이제 copy file에 dummy*44 + 0x804851e + dummy*4(shellcode의 주소가 될 부분) + nop(\x90)*1000 + shellcode


의 값을 넘겨주고 core dump를 한 번 가져와보겠다.



성공적으로 core dump가 떠졌다.


core dump로 메모리를 읽어와서 바로 shell을 가져와보겠다.



nop의 위치를 찾았다.


이제 우리가 넘겨줄 payload는 명확해졌다.


dummy*44 + 0x804851e + 0xbffff6e4(임의의 nop의 위치) + nop(\x90)*1000 + shellcode가 


우리가 넘겨줄 payload가 될 것이다. 한 번 payload를 복사본에 넘겨줘보겠다.



성공적으로 shell을 가져왔다.


이제 원본 파일에 payload를 넘겨주고 권한이 상승한 shell을 가져오도록 하겠다.



성공적으로 shell을 가져왔다.


assassin으로 가는 password는 pushing me away이다.

Comments