감자 텃밭

[HackCTF] Poet 본문

my_study/HackCTF

[HackCTF] Poet

g2h 2021. 8. 9. 20:06

이번에 풀어볼 문제는 Hackctf에 Poet 문제 일단 해당 문제를 실행시켜 보았다.

해당 프로그램을 실행시키니 시인과 저자를 찾는? 프로그램인 거 같다 계속해서 입력을 받도록 되어 있는 거 같다.

해당 프로그램에 적용되어 있는 메모리 보호기법을 확인해보았다.

NX가 걸려있어 쉘코드는 실행이 되지 않을 것이다.

일단 IDA를 통해 상세한 분석을 해보았다.

IDA를 통해 확인하였을 때는 while문을 통해 계속 돌다 dword_6024E0의 값이 1000000과 동일하면 break를 통해 반복문이 종료되며 reward함수를 호출한다.

 

dword_6024E0은 bss영역에 존재하고 있다

 

reward함수를 확인해보면 flag를 던져주는 거 같다.

또한 이 외에 3개의 함수가 더 존재하는데 하나하나 확인해보았다.

먼저 get_poem함수를 보면 입력을 받을 수 있도록 gets를 통해 poem에 입력을 받는다 여기서 bof가 일어날 수 있다 

하지만 여기서 중요한 것!!!

※ gets로 입력받은 후 우리가 변조시켜야 할 dword_6024E0 값을 을 초기화시킨다 그렇다는 건 이 함수에서는 bof를 일으켜도 값을 변조할 수 없다

그 후 get_author 함수를 보면 여기서도 gets를 통해 입력받을 수 있다 여기서 bof를 일으키면 될 거 같다

poem과 unk_6024 A0 둘 다 변조시켜야 할 값과 같은 bss영역에 존재하므로 bof를 통해 dword_6024E0의 값을 변경하면 된다는 것이 확실해 져싿

마지막 함수를 확인해보면

첫 번째 poem에 입력한 값을 통해 해당 if문에 있는 문자열과 일치할 경우 dword_6024E0에 값이 100씩 증가하는 거 같다.

그럼 이제 해야 하는 것은 unk_6024 A0로부터 dword_6024E0까지의 거리 값을 구하기만 하면 된다

이 값은 IDA로도 확인이 가능하고 gdb를 통해서도 확인이 가능하다.

 

먼저 gdb를 통해 확인해보면

85번째 줄을 보면 우리가 if에서 비교해야 할 eax에 들어갈 값을 표시해준다  0x6024e0인 거 같다

그 후 우리가 입력할 get_author함수에서 입력받는 값의 위치는

0x6024a 0이며 이 둘을 빼면

0x40이 나온다 즉 거리 차이는 10진수로 64만큼의 거리가 나온다.

IDA로 확인을 해보면

bss영역에서의 두 변수 간의 거리 차이도 0x40 즉 64만큼의 거리가 나온다.

그럼 이제 64만큼의 더미 값을 채운 후 dword_6024E0의 값을 1000000으로 바꿔주면 된다.

해당 코드는 아래와 같이 작성했다

두 번째 함수인 author에서 bof를 일으키기 위해

첫 번째 입력받는 부분에서 임의의 값을 보낸 후 그 후 페이로드를 보내 공격하도록 작성하였다

그 결과

성공적으로 공격하여 플래그를 획득하였다!!! 

이번 문제는 ret에서 변조가 아닌 bss영역에 특정 변수 간의 거리를 확인 후 특정 변수의 값을 변조하는 문제였다

나름 재밌었다.

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

[HackCTF] random  (0) 2021.08.09
[HackCTF] 1996  (0) 2021.08.09
g++ pwn  (0) 2021.07.23
bof_pie  (0) 2021.07.22
basic_fsb  (0) 2021.07.21