Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF RTC Write-up

Ainsetin 2020. 5. 1. 10:48

오랜만에 라옵을 작성해본다.

 

요즘 동아리 관련 일을 하니 며칠동안 안잡은 해킹도 자연스럽게 하게 된다. 그런 의미로 열심히 작성해보겠다.

 

이번 문제는 RTC(Return to csu) 문제이다. 한번 파헤쳐보자.

 

 

우선 zip 파일 안에 어떤 것이 있는지 보겠다.

 

 

문제 바이너리와 바이너리에 맞는 libc 파일 하나가 들어 있었다. 우선 바이너리 안에 있는 보호 기법을 확인하자.

 

 

64bit 기반 아키텍쳐이고, NX bit 이외에 특별한 보호 기법이 보이지 않는다. 이제 IDA로 까보자.

 

main()

보니까 간단한 write & read 프로그램이다. buf의 크기가 0x40byte이고, read로 0x200을 받으므로 BOF 취약점이 생긴다.

 

그런데, NX bit가 걸려 있으므로 쉘코드를 놓고 실행하지는 못하기 때문에,

직접 system 함수와 binsh 문자열을 찾아 실행시켜야 한다.

 

functions

이 바이너리 파일은 libc 파일을 제공해주어 그곳에서 system과 binsh을 찾으면 되긴 하지만,

이번에는 Return to csu 취약점을 공부하기 위해 바이너리 내에 있는

 

"__libc_csu_init"

 

을 사용할 것이다. 바로 이 함수를 파헤쳐보겠다.

 

__libc_csu_init

이 함수는 Hex-ray로 볼 경우 이해가 어렵고 누락된 것도 있어 어셈블리어로 직접 보겠다.

 

__libc_csu_init (assembly)

여기서 사용할 부분은 3번째와 4번째 박스 안에 있는 어셈블리어 코드이다.

 

우선 loc_4006A0 부분부터는 r13, r14, r15 의 레지스터 값을 각각 rdx, rsi, edi 레지스터에 집어넣고, [r12+rbx*8]을 주소로 해 call 명령어를 실행한다.

 

이 말만 들으면 레지스터만 세팅을 잘 해줘도 내가 원하는 함수를 실행할 수 있을 것 같다. 그런데 어디서 세팅을 할까?

 

바로 loc_4006B6 부분을 보면, "pop [레지스터]"가 여러개가 있는 것을 볼 수 있다.

따라서 이 부분은 스택에서 값을 가져와 레지스터에 간접적으로 세팅할 수 있는 부분인 것이다.

 

Thanks to "https://py0zz1.tistory.com/107"

 

자, 이제 exploit 과정을 생각해보자.

 

어느정도 생각을 해보았다면 더보기를 눌러보자.

더보기

-------------------------------------------------EXPLOIT PROCESS------------------------------------------------

1. bss에다 "/bin/sh\x00"을 삽입하기 위해 pop이 시작되는 부분인 0x4006BA를 RET로 주고, 다음과 같은 레지스터를 스택에 세팅한다.

rbx=0, rbp=1, r12=read_got, r13=8, r14=bss, r15=0

 

2. RET를 0x4006A0으로 돌리면 rdx, rsi, rdi가 세팅되고, rbx에 1이 더해져 rbp와 같아지므로 바로 pop이 있는곳 밑으로 내려간다.

 

3. rsp가 8 더해지므로 더미값을 8byte 주고 다음과 같이 call을 하기 위해 레지스터를 세팅을 한다.

read(0, bss, 8);

write(1, write_got, 8);

read(0, write_got, 8);

system("/bin/sh\x00");

 

4. "2"번의 방법을 써서 각각의 함수를 실행시킨다.

 

5. 첫번째 read에 "/bin/sh\x00"을 p.send로 보낸다.

 

6. write_got를 p.recvuntil의 방법으로 memory leak하고, libc의 system의 실제 주소를 구하기 위해 offset으로 계산한다.

 

7. 3번째 read에서 write_got를 p.send를 통해 libc의 system 함수의 실제 주소로 바꾼다.

 

8. system으로 변조된 write_got를 주소로 주어 Shell 획득

--------------------------------------------------------------------------------------------------------

 

 

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

 

 

flag가 따이는 것을 볼 수 있다!

 

이로써 rtc에 대한 내용은 정리가 마무리 되었다.

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

HackCTF Unexploitable #1 Write-up  (0) 2020.02.20
HackCTF You are silver Write-up  (0) 2020.02.17
HackCTF ROP Write-up  (0) 2020.01.14
HackCTF pwning Write-up  (0) 2020.01.14
HackCTF Beginner_Heap Write-up  (0) 2020.01.13