Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF pwning Write-up

Ainsetin 2020. 1. 14. 11:33

이번에는 pwning 문제를 풀어보겠다.

 

 

췤쉨췤쉨췤쉑

 

 

음 평범한 NX Partial RELRO 문제이다. IDA로 코드 분석해보자.

 

main()

우선 main에서는 vuln 함수를 호출한다.

 

vuln()

vuln 함수는 입력하고 싶은 문자열의 길이를 입력한 후 조건을 만족하면 nptr에 입력할 수 있는 함수 같다.

 

그런데, 입력할 때 일반적인 gets를 사용하지 않고 get_n이라는 함수를 거쳐 받는다.

 

어떤 취약점이 있을지 한번 get_n을 보자.

 

get_n()

보니 a1이라는 주소부터 v5를 증가시키면서 하나하나씩 대입하는 것을 볼 수 있다.

 

그런데.... 함수의 두 번째 인자는 unsigned int, 즉 부호 없는 int형이었다!!

 

따라서 우리는 첫 번째 입력을 할 때 -1을 입력한다면, vuln 함수에서 v2=-1이 되어 if문을 통과하고, 두 번째 get_n에서는 a2에 -1이 입력되면 (unsigned int형의 max값-1)로 값이 바뀐다. 따라서 4294967295byte만큼 입력받을 수 있게 된다.

 

바이너리에 do_thing이라는 int 0x80을 호출하는 syscall도 있었지만, 코드가 복잡해지므로 그냥 libc leak을 통한 system함수 호출을 통해 익스 해보겠다.

 

우선, printf를 많이 쓰고 있어서 printf의 실제 주소를 출력한 다음에 leak을 한 다음 libc base를 구한다.

 

그다음, system과 binsh 주소를 알아내 vuln을 다시 호출해서 실행시키면 쉘을 딸 수 있을 것이다.

 

우선 printf의 주소부터 알아보자. printf_got를 인자로 주면 될 것 같다.

 

 

우선 이 코드로 libc에 있는 printf의 offset을 찾았다.

 

 

마지막 1.5byte가 020인 것을 알아냈다!

 

따라서 우리는 libc-database에서 맞는 libc를 찾으면 된다.

 

 

system_offset = 0x3a940

binsh_offset = 0x15902b

 

이제, 인자를 집어넣기 위해 ROPgadget으로 가젯을 찾아주겠다.

 

 

pop_ret = 0x804835d

 

자, 이제 exploit code를 작성해보자.

 

 

 

flag가 출력된 것을 볼 수 있다!!

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

HackCTF You are silver Write-up  (0) 2020.02.17
HackCTF ROP Write-up  (0) 2020.01.14
HackCTF Beginner_Heap Write-up  (0) 2020.01.13
HackCTF gift Write-up  (0) 2020.01.08
HackCTF Look at me Write-up  (0) 2020.01.08