★strncpy(buffer, argv[1], 48): strncpy는 argv[1]을 딱 48byte만 복사한다. 다행인 것은 return address까지 복사하므로 return address에 원하는 주소를 넣을 수 있다.
Buffer 영역을 사용해보면 좋겠다고 생각했다.
일단 return address에 &RET을 넣어서 RET으로 이동한 후,
Buffer의 시작 주소를 RET의 이전 함수의 base pointer에 넣어서 buffer의 시작주소로 esp가 이동하면, buffer의 처음부터 &system + dummy 4byte + &“/bin/sh”로 payload를 주면 될 것 같다.
#RET의 주소
RET의 address: 0x80484e0
Little endian => “\xe0\x84\x04\x08”
#system의 주소
실행 후 system의 address: 0x40058ae0
Little endian => “\xe0\x8a\x05\x40”
#“/bin/sh”의 주소
“/bin/sh”의 address: \x400fbff9
Little endian => “\xf9\xbf\x0f\x40”
Strncpy로 argv[1]은 48byte만 복사되지만 그 뒤로 NOP+shellcode를 줘도 해당 NOP의 주소로 이동하게 하면 상관없다.
따라서 FPO을 했을 때처럼 buffer는 NOP의 주소로 채우고 sfp에 buffer의 시작주소를 주면, ret에 leave의 주소를 넣었을 때 leave 수행 시 sfp로 이동해서 buffer의 시작주소로 esp가 가리키게 되고, 따라서 buffer에는 NOP의 주소로 채워져 있으므로 NOP이 위치한 곳으로 이동해서 shellcode를 실행할 수 있다.
Buffer의 시작주소: 0xbffffa70
Argv[1] 시작주소: 0xbffffbf9
Buffer에 넣을 주소(NOP의 주소): 0xbffffc31
NOP의 주소: 0xbffffc08
Buffer의 시작주소: 0xbffffa40
다시 buffer의 시작주소와 NOP의 주소를 제대로 구하니까 bash쉘이 떴다.
쉘코드를 사용하는 것이 편할 것 같아서 쉘코드를 사용했다.
원본파일에 해보자.
성공!
“no place to hide”
[LOB] level 18: succubus -> nightmare (0) | 2019.06.28 |
---|---|
[LOB] level 17: zomebie_assassin -> succubus (0) | 2019.06.28 |
[LOB] level 15: giant -> assassin (0) | 2019.06.26 |
[LOB] level 14: bugbear -> giant (0) | 2019.05.15 |
[LOB] level 13: darkknight -> bugbear (0) | 2019.05.15 |