Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF RTL_Core Write-up

Ainsetin 2020. 1. 7. 21:21

Return to Libc 문제인데, Core이 붙어 있다. 무슨 문제인지 궁금하다. 확인해보자.

 

 

이번에는 zip 파일을 주었다. 아마도 libc 파일도 주는 것 같다.

 

checksec부터 해보자.

 

 

RTL을 사용할 수 있도록 NX bit만 설정되어 있는 상태다.

 

IDA로 코드를 확인해보자.

 

main()

 

보니까 check_passcode의 리턴 값과 hashcode가 같으면 core 함수를 호출한다. hashcode는 0xc0d9b0a7이다.

 

그럼, 다음으로 core 함수를 보자.

 

core()

보니까 printf의 주소를 주고, read 함수로 BOF를 일으킬 수 있다.

 

그렇다면, 먼저 check_passcode 함수를 봐야겠다.

 

check_passcode()

우선 i는 0부터 4까지 돌리는 것을 보니 for문은 5번 돌아간다. 안쪽을 보자.

 

v2에 4byte씩 끊어서 a1에 들어 있는 값을 더해주는 것을 알 수 있다. 따라서 hashcode값을 5로 나눠서 줘야 한다.

 

 

그런데 5로 나누어 떨어지지 않는다. 따라서 3235492005를 5로 나눈 다음 하나에 2를 더해야 값이 올바르게 들어간다.

 

 

우선 기본적인 hex 값은 0x2691f021이고, 5덩어리 중 하나에만 2를 더해 0x2691f023을 넣으면 된다.

 

if문을 통과하기 위한 payload의 구성은 "\x21\xf0\x91\x26"*4+"\x23\xf0\x91\x26"이다.

 

자, 이제 BOF를 터뜨리면 되는데, 쉘을 실행시키거나 flag를 출력하는 함수가 없다.

 

따라서 우리는 주어진 libc의 system과 binsh offset을 알아내 문제를 풀어야 한다.

 

우선 gdb로 libc를 까서 printf의 마지막 1.5바이트를 구하자.

 

020인 것을 확인하고 난 후, libc-database에서 찾아야 한다.

 

 

여기서 system과 binsh 문자열 offset을 찾았다!!

 

system_offset=0x3a940   bin_sh_offset=0x15902b

 

 

바이너리의 core 함수에서 printf의 주소를 주므로 저 주소를 leak 하고 offset을 빼면 libc_base를 구할 수 있다.

 

구해야 하는 것은 모두 구했으므로 이제 exploit code를 작성해보자.

 

buf의 크기는 0x3e=62byte이므로 sfp 4byte와 더한 66byte를 dummy로 채우고 system, dummy 4byte, binsh이 된다.

 

exploit code는 다음과 같다.

 

 

실행시켜보면....!

 

 

쉘을 딸 수 있었다!!!!

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

HackCTF gift Write-up  (0) 2020.01.08
HackCTF Look at me Write-up  (0) 2020.01.08
HackCTF Random Key Write-up  (0) 2020.01.07
HackCTF 1996 Write-up  (0) 2020.01.07
HackCTF poet Write-up  (0) 2020.01.07