감자 텃밭

[HackCTF] Look at me 본문

my_study/HackCTF

[HackCTF] Look at me

g2h 2021. 8. 16. 17:33

이번에 풀어볼 문제는 hackctf의 lookatme라는 문제이다 일단 제목으로는 추측이 안된다!!

해당 프로그램을 실행시켜 보았다.

해당 프로그램을 실행시키면 hellooooooooooo라는 문자열과 특정 값을 입력받을 수 있도록 되어있다.

흠 일단 적용되어있는 메모리보호기법을 확인해보았다.

nx가 걸려있는것으로 보아 쉘 코드는 실행이 되지 않을 것 같다.

 해당 프로그램을 IDA를통해 좀 더 상세히 분석해보았다.

 

main함수에서는 해당 문제의 이름과같은 look_at_me 함수를 호출하고 해당 함수로 들어가 보면

puts로 문자열을 출력하고 gets로 문자열을 입력받는다 이 부분에서 bof가 일어난다

여기서 이상한 점을 발견했다 

해당 프로그램에 함수가 굉장히 많이 있었다 여기서 이상한점을 느끼고 해당 파일을 확인했더니

역시나 dynamic linked방식이 아닌 static linked방식으로 되어있다 이 방식은 프로그램 내부에 모든 함수가 저장되어 있다 이를 통해 sysyem 함수와 binsh를 실행시키면 될 것이다. 방법은 mprotect함수를 이용한 rop를 사용하면 된다.

이 함수는 원하는 역역의 권한을 변경시켜줄 수 있다 

bss영역을 찾아 해당 영역에 쉘 코드를 입력한 후 권한을 주어 실행시킬 수 있다.

이는 nx가 걸려있어도 쉘코드 실행이 가능하다.

우리가 찾아야 할 것은

1. gets의 주소

2. bss역역의 주소 (쉘 코드를 입력할)

3. bss영역의 시작 주소 (권한을 줘야 하기 때문)

4. pr 가젯

5. pppr 가젯

6. 쉘 코드

7. mprotect의 주소

 

해당 함수의 주소들을 구하고

가젯들을 구한 후

bss영역 까지 구해야 할 것들을 모두 구했다

 

그리고 우리가 입력받는 값의 위치부터 ret까지의 거리 또한 구해야 한다

0x18 즉 24 +sfp4까지 총 28바이트의 더미 값이 필요하다.

 

이제 해당 익스 코드는 아래와 같다

쉘 코드는 25비트 쉘 코드를 사용하였다

28바이트의 더미 값을 넣어 ret까지 접근하여 gets 함수를 호출하여 bss영역에 쉘 코드를 삽입하고 pr가젯을 이용하여 돌아갈 함수의 주소를 mprotect로 설정하여 mprotect를 실행 그후 bss시작주소를 넣는다 시작주소를 넣는 이유는 첫번째 인자값이 친자로 쓰일 주소의 값이 1000의 배수가 되어야 하기 때문이다. 그 후 값을 넣고 7은 rwx 의 권한이다.

그 후 pppr가젯을 이용하여 최종적으로 bss영역에 있는 쉘코드를 실행시킨다. ( 코드를 좀 더 이쁘게 짜야겠다..)

해당 코드를 실행시키면 성공적으로 쉘을 획득할 수 있었다.

 

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

[HackCTF] ROP  (0) 2021.08.16
[HackCTF] gift  (0) 2021.08.16
[HackCTF] Beginner_Heap  (0) 2021.08.10
[HackCTF] random  (0) 2021.08.09
[HackCTF] 1996  (0) 2021.08.09