★no stack, no RTL: stack overflow도 아니고, RTL도 아니라는 의미같다.
★buffer[40]: buffer의 크기가 40byte이므로, 스택은 buffer(40) + sfp(4) + ret(4)의 구조를 가질 것이다.
★if(argc < 2): 실행파일에 같이 줘야 하는 인자의 개수가 2개 이상
★if(argv[1][47] == ‘\xbf’), if(argv[1][47] == ‘\x40’): buffer가 argv[1][0] ~ argv[1][39], sfp가 argv[1][40] ~ argv[1][43], ret이 argv[1][44] ~ argv[1][47]이므로 ret 영역의 주소가 ‘\xbf’ 또는 ‘\x40’으로 시작하면 안 된다. 스택 영역의 주소와 libc 영역의 주소를 사용할 수 없는 것이다.
★memset(buffer, 0, 44): buffer와 sfp 영역을 초기화해버린다. 다행히 아직 ret영역에 주소를 넣어서 사용할 수 있다.
다행히 지난 번 RTL을 처음 할 때, execl() 때문에 구글링 한 것으로 ret sled를 알게 되어서 ret 영역의 주소는 ‘\xbf’나 ‘\x40’으로 시작하지 않으므로 사용할 수 있을 것 같다.
<RET sled 기법>
-return address에 RET의 주소를 넣는 기법이다.
-RET은 리턴하면서 esp가 이전 함수의 ebp를 가리키게 되는데, 이 ebp 주소에 원하는 주소를 넣으면 된다.
RET이 프롤로그의 역과정을 하기 전에
RET의 address: 0x804851e
Little endian 방식으로 작성할 때는 “\x1e\x85\x04\x08”
#system의 실행 후 주소
RET의 sfp에 넣은 address = system의 address: 0x40058ae0
Little endian => \xe0\x8a\x05\x40
#”/bin/sh”의 주소
#payload
지난 번에는 RET의 sfp 부분에(이전 함수의 ebp) shellcode의 주소, 실질적으로는 NOP의 주소를 넣었지만, shellcode 사용이 번거로워서 그냥 간접적으로 RTL 기법을 사용하도록 하겠다. Return address에 RET의 주소만 넣으면 그 이후부터의 payload는 nop sled나 RTL을 사용하는 것과 비슷하다고 생각되기 때문에.
Buffer + sfp는 memset 함수로 인해 0으로 초기화되지만 상관없으니 dummy로 채운다.
Return address에는 구한 RET의 주소를 넣는다.
그럼 buffer 구조에서 return address가 리턴 시 return address에 담긴 주소를 ebp가 가리키게 되어 RET의 주소를 가리킨다. 다시 이동한 RET에 의한 구조가 생기는데, RET의 return address에는 system의 주소를 넣는다. 그럼 리턴 시 return address에 담긴 주소로 이동하여 system의 주소로 이동한다. System에 의한 구조도
이 구조를 가지고 있으므로 현재 system에 의한 스택의 구조가 위와 같은데, 원하는 것은 system 함수가 “/bin/sh”를 실행하길 바라는 것이므로 system의 argument에 “/bin/sh”의 주소를 넣어야 한다. 이전에 구했듯이 ebp + 8 위치에서 system이 인자(argument)를 처리한다. System의 return address에는 이제 넣을 것이 없으므로 dummy로 채운다.
그렇다면 payload는 다음과 같이 구성된다.
Buffer + sfp(44) + return addr(&RET) + RET의 이전 함수의 base pointer(&system) + return address(dummy) + argument(&“/bin/sh”)
임시 디렉터리에서 복사한 파일의 심볼릭 링크 파일로 성공했으니 원본파일에서 해보자.
성공!
“pushing me away”
[LOB] level 17: zomebie_assassin -> succubus (0) | 2019.06.28 |
---|---|
[LOB] level 16: assasin -> zombie_assassin (0) | 2019.06.26 |
[LOB] level 14: bugbear -> giant (0) | 2019.05.15 |
[LOB] level 13: darkknight -> bugbear (0) | 2019.05.15 |
[LOB] level 12: golem -> darkknight (0) | 2019.05.15 |