Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF You are silver Write-up

Ainsetin 2020. 2. 17. 23:14

오랜만에 hackctf 라업을 작성하는 것 같다.

 

Format String Bug를 제대로 공부하고 와서 그런지 이번 문제도 어렵지 않게 풀 수 있을 것 같다.

 

그럼 문제를 풀어보자!!

 

 

checksec부터 시작!!

 

 

평범하게 컴파일 된 바이너리이다. GOT overwriting을 할 수 있다.

 

그럼 IDA로 한번 보자.

 

main 함수

 

보니까 s에 46byte 크기를 입력할 수 있고, 그것을 printf로 그냥 출력한다. 따라서 FSB 문제라는 것을 알 수 있다.

 

문제의 구성은 get_tier함수를 실행하고 난 리턴 값을 출력해 주는 것으로 간단하다.

 

get_tier()

 

보니까 main에서 가져온 v6값을 전제로 티어를 정해주는 것을 알 수 있었다.

 

play_game()

 

그런데 main에서 호출되지 않은 함수가 존재하였다!!

 

이것은 인자가 4라면 flag를 출력해주는 함수였던 것이다.

 

따라서 위에서 FSB 공격으로 printf_got를 play_game의 주소로 변조하면....

 

13번째 줄 printf((const char *)v5);이 play_game((const char *)v5);로 바뀌는 효과를 얻을 수 있다!!

 

그런데, 문제는 티어가 실버기 때문에 v6의 값이 75 초과로 바뀌어야 한다는 것이다. 어떻게 해결해야할까?

 

main에 선언된 변수

 

해결책은 바로 변수의 위치에 있었다.

 

s는 rbp에서 0x30만큼 떨어진 곳에 위치해 있고, v6는 0x4만큼 떨어진 곳에 위치해 있다.

 

그러므로 46byte를 입력할 수 있다는 것은 v6의 2byte를 변조할 수 있다는 것과 마찬가지였다.

 

그림으로 표현한 모습

 

따라서 FSB를 시도한 후 v6의 2바이트를 바꾸면 된다. 무난하게 가장 큰 z로 하겠다.

 

 

AAAA를 입력하고 난 후 6번째에서 같은 값이 나오는 것을 알 수 있다.

 

64bit FSB에서는 출력할 때 %p나 %lx, overwriting 할 때는 %ln, 아니면 %hn이나 %hhn같은 방법으로 나눠서 전달하는 방법이 있다. 레지스터 RSI, RDX, RCX, R8, R9의 정보를 출력한 다음 스택 정보를 알려주기 때문에 offset이 6 이상이다. 그리고 printf_got를 출력할 때 fgets로 데이터를 받아왔기 때문에 \x00, 즉 NULL을 앞에 채워서 출력하기 때문에 got를 먼저 출력한다면 원하는 공격을 할 수가 없다. (read로 받아올 경우에는 \x00을 그대로 입력해준다.)

 

위의 유의사항을 생각해 본다면, "%(play_game의 10진수 주소)x%(?)$lnAA + printf_got(8byte) + v6 75 이상 변조" 가 된다. ("AA"는 s를 8byte씩 올바르게 끊어 printf_got가 덮이도록 자리를 맞춰준 것이다. 이를 padding이라고 한다)

 

play_game의 주소는 0x4006D7=4196055이다.

 

64bit FSB에서는 스택 출력을 8byte씩 순서대로 한다. 따라서 %p로 출력할 때 "%4196055" -> "x%(?)$lnAA" -> "printf_got" 순서로 출력되는 것이다.

 

이 순서대로 하면 6번째에서 처음 스택이 출력되었으므로 8번째에 printf_got가 출력될 것이다.

 

따라서 (?)에 들어갈 숫자는 8이다.

 

최종 payload는 다음과 같다.

 

%4196055x%8$lnAA+p64(printf_got)+"z"*(46-24)

 

그럼 이제 exploit code를 작성해보자.

 

 

하.... 64bit의 길은 멀고도 험하다...ㅠㅠㅠㅠㅠ 레지스터나 호출 규약 공부부터 다시 해야 되나....

 

4196055나 자리를 주어서 공백이 많이 출력되는 것을 볼 수 있다

 

아무튼 오늘부로 FSB를 완전히 이해할 수 있었다...

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

HackCTF RTC Write-up  (0) 2020.05.01
HackCTF Unexploitable #1 Write-up  (0) 2020.02.20
HackCTF ROP Write-up  (0) 2020.01.14
HackCTF pwning Write-up  (0) 2020.01.14
HackCTF Beginner_Heap Write-up  (0) 2020.01.13