감자 텃밭

bof_pie 본문

my_study/HackCTF

bof_pie

g2h 2021. 7. 22. 14:15

이번에 풀어볼 문제는 bof_pie문제이다 pie메모리 보호 기법은 처음이라 조금 모호한 부분이 있었다

일단 해당 프로그램을 실행시켜보았다.

프로그램 실행 모습

실행시켰더니 j0n9hyun을 아냐 물어보고 어떠한 주소 값을 출력시켜주는 거 같다 또한 문자를 입력하면

Nah...라는 문자열을 출력해준다.

적용되어있는 메모리 보호 기법을 확인해보았다.

NX와 PIE가 적용되어있다 그렇다면 쉘 코드를 실행시킬 수 없고 코드 영역을 포함한 모든 주소가 랜덤으로 매핑될 것이다.

 

좀 더 명확한 분석을 위해 IDA를 통해 확인해보았다.

main함수에서는 특별한 게 없다 welcome함수를 불러오고 puts를 이용하여 문자열을 출력한다

그럼 welcome 함수를 확인해보자

 

j0n9 hyun을 아냐고 묻고 j0n9 hyun의 주소가 아닌 welcome의 주소를 출력해주고 있다

그럼 여기서 뭘 해야 하는지 감이 잡혔다 j0n9 hyun의 주소를 찾아 아래의 scanf를 이용하여 bof를 일으킨 후

welcome대신 j0n9hyun의 주소를 이용하여 j0n9 hyun함수를 불러오면 될 것이다

j0n9hyun함수를 살펴보자

역시나 그렇듯 j0n9 hyun함수가 존재하고 fopen을 이용하여 플래그를 알려주는 것 같다.

그럼 scanf를 이용해서 ret까지의 거리 값을 구해보자

86번째 줄이 봐야 할 곳이다. ebp로부터 0x12(18바이트)만큼 떨어져 있으므로 18+sfp(4) 총 22 바이의 더미 값을 채운 후

ret부분에 j0 n9 hyun의 주소 값을 넣으면 될 것이다

하지만 pie가 걸려있기에 offset를 이용해야 한다.

j0n9 hyun의 offset는 00000890이고

welcome의 offset는 00000909이다 그럼 해당 공격코드를 작성하기 위해 필요한 정보는 모두 구해졌다

프로그램을 실행시킬 때 나오는 welcome 주소에서 offset값을 빼서 base주소를 구한 다음 j0n9 hyun의 오프셋을 더해

실제 j0n9hyun의 주소를 구하여 공격을 하면 된다.

이제 공격코드를 작성해보자

 

welcome의 오프셋 값과 j0n9 hyun의 오프셋 값을 특정 변수에 저장시켜놓고

recvuntill을 이용하여 특정 문자 이후의 값(주소)을 recv를 이용하여 welcome에 저장한다 #int형으로 10자리를 16진수로 받아 온다는 뜻

그 후 입력받은 welcome주소에서 welcome의 오프셋 값을 빼서 base주소를 구한다 그 후 base주소에서 j0n9 hyun의 오프셋주소를 더해서 j0n9 hyun의 주소를 구한다 그후 rsp까지의 22더미값을 채운 후 ret부분에 j0n9hyun의 주소를 넣어 실행시킨다 

성공적으로 공격에 성고 하여 flag를 획득할 수 있었다.

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

[HackCTF] Poet  (0) 2021.08.09
g++ pwn  (0) 2021.07.23
basic_fsb  (0) 2021.07.21
rtl_core  (0) 2021.07.21
rtl_world  (1) 2021.05.28