Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF Look at me Write-up

Ainsetin 2020. 1. 8. 11:59

이번에는 '나를 봐!' Look at me 문제를 풀어보겠다!

 

 

우선 바이너리를 checksec 해보자.

 

 

보니까 NX bit만 걸려 있다. 따라서 쉘 코드만 사용 불가능하다.

 

이번엔 IDA로 문제 코드를 분석해보자.

 

main()
look_at_me()

보니까 main에서 look_at_me 함수를 호출하고, gets로 v1을 받아 오는 것 같다. 그런데.....

 

 

함수의 개수가 923개인 것을 보니 평범한 바이너리는 아닌 듯하다. 왜 그런지 리눅스의 file 명령어를 통해 알아보자.

 

많은 바이너리가 dynamically linked로, 실행 파일 안에 모든 함수가 들어가 있는 것이 아닌, 외부 라이브러리를 연결하여 불러오는 방식을 사용하여 파일 크기가 그렇게 크지 않다.

 

그러나 이 statically linked 파일은 필요한 모든 함수가 바이너리 안에 모두 내장되어 있기 때문에 파일 크기가 아주 크지만, 함수 주소를 쉽게 구할 수 있다는 장점이 있다.

 

따라서 우리는 system("/bin/sh")을 실행시키기 위해 system 함수와 binsh 주소를 알아내 RTL처럼 하면 될 것 같지만, system 함수가 존재하지 않았다. 따라서 다른 방법을 사용해야 되는데......

 

전에 lazenca에서 본 ROP 문서 중 mprotect 함수를 사용한 ROP 과정을 보았다.

 

mprotect 함수는 NX bit같은 특정 메모리 실행 권한을 변경할 수 있는 함수이다. 따라서 보호 기법이 걸려 있어도 사용자가 이 함수를 호출해 쉘 코드를 실행시킬 수 있는 환경을 만드는 것이다.

 

따라서 우리는 이 함수를 실행시키면 쉘코드를 어디에 입력받을지만 고민하면 된다.

 

간단하다. 고정주소인 bss 영역에 쉘 코드를 입력하면 될 것이다.

 

구해야 할 것은 다음과 같다.

 

1. mprotect함수의 주소  2. gets 함수 주소(쉘 코드 입력 전용)  3. bss 영역 주소

 

gdb와 IDA로 모든 주소를 찾았다.

 

 

mprotect : 0x806e0f0   gets : 0x804f120   bss : 0x80eaf80

 

이제 구할 것은 다 구했다.

 

주의할 점은, mprotect의 인자는 권한을 변경할 시작 주소 , 길이, rwx 권한인데 첫 번째 인자인 주소가 0x1000의 배수이어야 한다. 따라서 주소의 뒤 3자리는 000이어야 한다.

 

따라서 권한을 줄 영역이 bss이므로 0x80eaf80 전인 0x80ea000부터 주면 된다.

 

이제 인자를 집어넣기 위해 pop ret와 pop pop pop ret 가젯을 찾아보자.

 

'ROPgadget --binary lookatme' 명령어로 가젯을 찾았다.

 

이제, RTL Chaining으로 문제를 풀 것이다.

 

exploit code는 다음과 같다.

 

 

32bit 기반 바이너리는 64bit 기반 바이너리와 달리 가젯을 사용할 때 인자를 순서대로 넣는 것이 특징이다. 그것과 mprotect 함수 인자만 유의하면 이 문제는 쉽게 풀 수 있다.

 

 

쉘이 실행된 것을 볼 수 있다.

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

HackCTF Beginner_Heap Write-up  (0) 2020.01.13
HackCTF gift Write-up  (0) 2020.01.08
HackCTF RTL_Core Write-up  (0) 2020.01.07
HackCTF Random Key Write-up  (0) 2020.01.07
HackCTF 1996 Write-up  (0) 2020.01.07