Pwnstar

HackCTF 0x2번 Basic_FSB 본문

Wargame/HackCTF

HackCTF 0x2번 Basic_FSB

포너블처돌이 2020. 1. 23. 14:14

세 번째 문제 basic_fsb이다.

Format string bug를 이용해서 푸는 문제 같은데 일단 IDA로 열어보았다.

32bit 파일이고, main 함수는 별 거 없었다.

 

 

이렇게 vuln()함수만 덜렁 있고, 들어가보니

 

fgets함수로 1024만큼 입력을 받는게 코드의 전부였다.

 

snprintf함수에서 format stirng bug 취약점이 발생할 것 같다.

 

우선 전형적인 fsb를 푸는 방식대로 입력을 줘 보았다.

 

이렇게 두 번째에 41414141(AAAA)이 나왔고, 이 부분을 이용할 수 있을 것 같다.

 

사실 이 문제를 풀기 전, fsb가 이해가 잘 되지 않아서 많은 블로그들을 돌아다니며 공부를 꽤나 오랫동안 했는데 그 덕분에 잘 이해를 하게 되었다.

 

다시 한번 풀어보면서 차근차근 풀이 과정을 써 보려고 한다.

 

1. string format 중 %n은 %n 이전에 출력된 문자들의 개수를 10진수 형식으로 변수에 입력할 수 있다.

 

2. got overwrite를 활용하여 첫 입력을 제물이 될 함수의 got, + 이전에 %n 이전에 출력될 문자들의 개수를 원하는 함수의 주소(10진수)로 준다면.

 

따라서 AAAA가 올 부분에 함수의 got를 입력해주고, 덮어줄 함수의 주소를 10진수 형식으로 %n과 함께 입력해준다면 되지 않을까??

 

우선 덮힐 got를 바로 다음에 실행되는 printf함수로 정했다.

printf_got = 0x804a00c

 

IDA에서 함수 목록을 보니

 

 

이렇게 system("/bin/sh")를 실행해주는 함수가 있고,

 

flag = 0x080485b4 = 134514100

 

이제 printf를 flag함수로 덮어주면 된다.

 

익스 코드는 다음과 같이 작성했다.

ex.py

flag함수 주소는 10진수로 134514100인데 4를 뺀 134514096을 입력한 이유는 처음에 printf_got를 입력하면서 4바이트는 채워졌기 때문이다.

'Wargame > HackCTF' 카테고리의 다른 글

HackCTF 0x5번 x64 Simple_size_BOF  (0) 2020.01.24
HackCTF 0x4번 x64 Buffer Overflow  (0) 2020.01.23
HackCTF 0x3번 내 버퍼가 흘러넘친다!!!  (0) 2020.01.23
HackCTF 0x1번 Basic_BOF #2  (0) 2020.01.13
HackCTF 0x0번 Basic_BOF #1  (0) 2020.01.13
Comments