Wargame/HackCTF

[HackCTF] Yes or no

h4won 2021. 4. 16. 21:36

문제

보호기법 확인

 

ldd 를 실행할 때마다 주소가 바뀜 -> ASLR

NX + ASLR 이 걸려있다.

 

 

ida 로 까본 모습이다.

 

 

gets() 가 실행되도록 값을 입력

-> bof 를 발생시켜 ret 를 변경가능

 

 

현재 NX bit, ASLR 이 적용된 상황에서 주소가 leak 되지 않고 있다.

-> 64 bit rop 기법을 통해 쉘을 얻을 수 있을 것이다.

 

두 가지 정도의 방법이 있다.

먼저 다음과 같이 기본적인 rop 기법을 이용하는 방법이다.

1. bss에 binsh 주입

2. put_got 주소를 leak 함

3. got overwrite 함

4. puts 실행함 

 

아니면 rop 을 이용하되, leak 을 한 뒤에 다시 main 으로 돌아가면 굳이 got overwrite 없이도 쉘을 실행할 수 있다.

 

 

문제 해결 과정

주소를 leak 한 뒤에 main 으로 돌아가는 방법을 써보겠다.

필요한 것들을 구해보도록 하자.

 

1. Gadget

pop rdi; ret;
ret

 

2. 처음에 입력해줘야 할 값

디버깅을 통해 if ( v10 == (v6 * v5) << (++v11 % 20 + 5) ) 부분 찾기

bp 를 건 다음에 eax 확인하기

 

처음에 입력해줘야 할 s 값

 

offset(ret 까지의 거리) : 0x12 + 8

 

 

 

 

익스플로잇

익스플로잇 코드를 작성해보았다.

저번에 풀었던 dreamhack x64 문제와 상당히 유사했다.

다만 한 가지 의문인 것이 두 번째 페이로드에 binsh 과 system 사이에 ret 가 있어야 한다는 것이다.

처음에 계속 쉘이 안따지길래 봤더니 저 문제였다.

근데 왜 포함해줘야 되는지를 잘 모르겠다;;

나중에 알게되면 이유를 써둬야겠다..

 

 

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