[pwnable.xyz] grownup(50 pts) :: Write-Up

두비니

·

2020. 9. 17. 05:05

 

 

 

 

 

Are you old enough for this one? Flag is in the binary itself.

 

 

플래그는 바이너리 자체에 있다고 하네요. 잘 분석해봅시다.

 

 

 

일단 main함수를 보면 가장 먼저 setup()함수가 실행되는 것을 확인할 수 있습니다. 일단 전체적인 흐름을 파악하기 위해 이따가 보도록합시다.

그 뒤에서는 18살보다 나이가 더 많은지 적은지 확인한 뒤 y로 대답하는 경우에는 프로그램이 종료되고, 아닌 경우에는 src에 0x84만큼 공간을 할당한 뒤에 이름을 입력받고 종료됩니다.

근데 21번줄에서 프린트하는 방식이 특이하네요. 뭔가 수상하니 우선 qword_601160부터 알아봅시다.

 

 

그전에 아까전에 처음 실행된 setup()함수를 확인해 줍시다.

 

 

signal함수라는 처음보는 함수가 있는데, 찾아보니 그냥 소프트웨어 인터럽트(software interrupt)로, 프로세스에 이상이 발견했을때 탐지하는 함수입니다. 그냥 무시하도록 하겠습니다.

참고: 12bme.tistory.com/224

 

[시스템프로그래밍] 시그널

시그널은 소프트웨어 인터럽트(software interrupt)로, 프로세스에 뭔가 발생했음을 알리는 간단한 메시지를 비동기적으로 보내는 것입니다. 시그널은 0으로 나누기처럼 프로그램에서 예외적인 상황

12bme.tistory.com

 

근데 6번줄에 보니 qword_601160byte_601168의 주소를 넣어주네요!!

byte_601168의 내용은 "%s\n"이네요.

 

 

즉 다시 main함수로 돌아와 값을 봅시다.

그럼 결국 21번 내용은 printf("%s\n", usr);네요.

 

여기서 주목할 점은 strcpy를 사용한다는 점입니다. 

 

 

fsb쓰면 되겠죠?

 

 

그럼 일단 flag의 위치를 찾아봅시다. 아이다에서 Alt + t 사용했습니다.

 

 

아참 FLAG검색할때는 스택에서 검색해줘야합니다. 그냥 함수 안에서 검색하면 안나옵니당.

아무튼 FLAG가 0x601080에 있다는 것을 알아냈네요. 당연히 저 FLAG{_the_real_flag_will_be_here_} 가 플래그는 아니겠죠?

 

그럼 이제 format string bug를 이용해 플래그를 알아냅시다.

%p를 일단 넉넉하게 넣어줍시다.

 

 

익스코드 돌려주면 다음과 같이 뜹니다.

 

 

보니깐 9번째 값이 0x601080인걸 확인할 수 있습니다. 이 값을 %p에서 %s로 확인하면 플래그를 확인할 수 있겠죠?

 

==FINAL PAYLOAD== 

 

 

굳굳