Tuuna Computer Science

[L.O.B] Load Of BufferOverflow) bugbear -> giant 본문

L.O.B

[L.O.B] Load Of BufferOverflow) bugbear -> giant

GuTTe 2019. 3. 27. 00:30
 
이번에는 bugbear에서 giant로 가는 문제를 풀어볼 생각이다. 
 
일단 문제의 소스를 보자
 
 
좀 기네요;; 
 
일단 이를 차분히 분석해보면 
 
 
이 소스코드에선 libc의 주소값을 구해서 buffer에 저장한뒤 lib_addr이라는 변수에 저장합니다. 
 
여기서 ldd assassin | grep libc란 assassin이라는 프로그램의 의존성이 있는 라이브러리중 libc를 찾는다는 뜻입니다. 
 
근데 우린 assassin을 접근할 수 없죠? 그럼 터미널에서 assassin대신 giant로 해봐여^^ 같은 시스템이니 같은 주소로 찍히겠져 
 
 
 
 
 
자 libc의 주소는 0x40018000입니다. 
 
이제 다음 코드를 봅시다. 
 
 
nm 명령어는 어떠한 것의 심볼을 알아볼 때 사용하는 것입니다. 
 
이 코드는 libc.so.6에서 __execve의 심볼의 오프셋을 buffer에 넣고 execve_offset에 넣습니다.
 
 
오프셋은 0x00091d48입니다. 
 
 
다음의 코드에서 우리가 구한 라이브러리의 주소 + execve함수의 오프셋을 더해 
 
execve함수의 주소값을 알아 냅니다. 
 
 
자 execve함수의 주소값은 0x400a9d48입니다. 
 
자그럼 공격패턴을 생각해봅시다. execve함수의 주소값을 알아냈으니 
 
이 함수의 인자값으로 execve(system(), /bin/sh, NULL); 이렇게 실행하여 쉘을 따는 것입니다! 
 
그럼 system()함수의 주소를 알아봅시다. 
 
 
 
system 함수의 주소값은 0x40058ae0이네요! 
 
그럼 /bin/sh의 주소값을 알아볼까여? 
 
 
이렇게 코드를 작성하고 
 
 
실행시키니 0x400fbff9가 나왔습니다 ㅎ 
 
여기서 아까 제가 NULL을 마지막에 줬죠? 이제 널값이 있는 주소도 한번 찾아봅시다. 
 
 
0xbffffe1b가 비어져 있네요 ㅎㅎ  씁시다! 
 
그래서 완성된 payload는 
 
./giant "`python -c 'print "A"*44+"\x48\x9d\x0a\x40"+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"+"\x1b\xfe\xff\xbf"'`"
 
execve를 올리고 system올리고 ret올리고 /bin/sh올리고 널값 올리고해서 이렇게 나옵니다. 
 
그리고 시스템에서 \x0a를 \x00으로 인식해서 이를 방지하기 위해 python 자체 나오는 값을 " "로 묶어줘여합니다. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Comments