LOB - succubus -> nightmare

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
KSH
Posts: 24
Joined: Thu Jul 21, 2016 5:39 pm

LOB - succubus -> nightmare

Post by KSH » Thu Aug 11, 2016 9:38 pm

서큐버스를 잡아봅시다.
1.홈 디렉터리
1.png
1.png (3.79 KiB) Viewed 494 times
2.소스코드
소스코드.png
소스코드.png (14.57 KiB) Viewed 494 times
나이트메어는 40byte char형 배열 buffe와 addr포인터 선언하고
메인의 인자가 2개보다 적다면 종료

addr에 strcpy의 주소를 넣습니다. 그리고 argv[1]+44(RET주소)가 addr과 같지 않다면 종료합니다.
조건을 통과한 뒤에는 argv[1]의 내용을 buffer에 복사한 뒤,
buffer+48지점에서 4byte만큼 A로 덮습니다.

이 프로그램은 리턴주소를 strcpy함수의 주소로 덮어씌우지 않으면 작동하지 않습니다.
그리고 buffer+48부분에 4byte를 A로 덮는다는 것은
strcpy함수의 리턴주소를 전부 A로 덮는다는 것입니다.

strcpy함수의 주소를 리턴주소에 넣었을 때, 스택은 다음과 같습니다.
| buffer+SFP | + | strcpy | + | AAAA |
44byte RET strcpy의 리턴

리턴주소에 strcpy가 있으므로 프로그램 종료와 동시에 strcpy가 실행될 것입니다. 이것을 이용하여
AAAA지점(strcpy의 리턴)에 쉘을 실행시키는 곳의 주소를 입력한다면 나이트메어의 쉘을 얻을겁니다.

공격을 하기 위해서는 다음과 같은 준비물이 필요합니다.
1.system함수 주소
2./bin/sh주소
3.buffer+48지점에 있는 AAAA의 주소
4.strcpy의 리턴주소에 덮어씌울 buffer의 주소

3.분석
disas_main1.png
disas_main1.png (25.46 KiB) Viewed 494 times
스택에 0x2c(44byte)만큼의 공간을 할당했습니다.
스택은 | addr(4) | + | buffer(40) | + | SFP | + | RET | 이 됩니다.
낮은주소 높은주소
disas_main2.png
disas_main2.png (20.21 KiB) Viewed 494 times
main+110부분을 보면 strcpy의 주소 0x8048410가 있습니다.
system함수의 주소를 알아내기 위해 브레이크를 걸고 실행했습니다.
system.png
system.png (5.01 KiB) Viewed 494 times
system함수의 주소는0x40058ae0입니다.
bin_sh.png
bin_sh.png (5.61 KiB) Viewed 494 times
/bin/sh의 주소는0x400fbff9입니다.

정확한 buffer의 주소를 알아보기 위해
| B문자 44개 | + | strcpy | + | AAAA | + | BBBB | + | CCCC |의 값을 주어
segmentation fault를 띄운 후, core를 살펴보았습니다.
&buffer.png
&buffer.png (20.83 KiB) Viewed 494 times
buffer의 시작주소는 0xbffffa90입니다. strcpy의 리턴주소는 buffer+48의 위치에 있으므로
0xbffffa90+48 = 0xbffffac0이 됩니다.

모든 준비물을 모았습니다.
1.system : 0x40058ae0
2./bin/sh: 0x400fbff9
3.strcpy : 0x8048410
4.buffer : 0xbffffa90
5.&AAAA : 0xbffffac0

페이로드는 이렇게 됩니다.
|\x90 * 4| + | system(4) | + | dummy(4) | + |/bin/sh| + |dummy(28)| + | strcpy | + | AAAA | | &AAAA | + | buffer |

4.공격
attack_1.png
attack_1.png (15.01 KiB) Viewed 494 times
이렇게 해도 되긴 됩니다만... 문자열 길이에 따라 주소가 변해서 번거롭기에 brute force로 해봤습니다.

<exploit.py>
exploit.png
exploit.png (17.1 KiB) Viewed 494 times
exploit.py는 페이로드의 &AAAA부분과 buffer 부분의 마지막주소를 0xff부터 0x00까지 돌립니다.
이 프로그램을 실행하면 자동으로 대입하여 결국 쉘을 실행시킵니다.(1분30초 걸렸습니다.)
attack_2.png
attack_2.png (14.63 KiB) Viewed 494 times
nightmare의 계정의 쉘과 패스워드를 얻었습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest