티스토리 뷰
1 2 3 4 5 6 7 | int __cdecl main(int argc, const char **argv, const char **envp) { char buf; // [rsp+0h] [rbp-10h] read(0, &buf, 256uLL); return 0; } | cs |
IDA로 보면 read 받고 끝난다. 그리고
1 2 3 4 | int get_shell() { return system("/bin/sh"); } |
이런 함수도 있는데 PIE가 걸려있음.
근데 어셈블리로 보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | .text:00000000000007A8 push rbp .text:00000000000007A9 mov rbp, rsp .text:00000000000007AC sub rsp, 10h .text:00000000000007B0 lea rax, [rbp+buf] .text:00000000000007B4 mov edx, 100h ; nbytes .text:00000000000007B9 mov rsi, rax ; buf .text:00000000000007BC mov edi, 0 ; fd .text:00000000000007C1 mov eax, 0 .text:00000000000007C6 call read .text:00000000000007CB lea rax, binsh ; "/bin/sh" .text:00000000000007D2 mov rdi, rax .text:00000000000007D5 mov rdx, rbp .text:00000000000007D8 add rdx, 28h .text:00000000000007DC lea rax, get_shell .text:00000000000007E3 mov rcx, rax .text:00000000000007E6 mov [rdx], rcx .text:00000000000007E9 mov eax, 0 .text:00000000000007EE leave .text:00000000000007EF retn | cs |
이렇게 나오는데 read 하고 get_shell 바로 call 하길래
PIE 걸려있고, 마지막 바이트 바꾸면 될 것 같아서 get_shell call 하는쪽으로 돌렸더니 따였다 ㅋㅋ
진헌이한테 물어보니 언인텐이라고 해서 다시 풀어보았다.
PIE 자체가 바이너리 영역 주소를 랜더마이징 하는건데 vsyscall 부분에 보면 PIE 안먹히는 부분이
있다고 한다.
1 2 3 4 5 6 | pwndbg> x/i 0xffffffffff600400 0xffffffffff600400: mov rax,0xc9 pwndbg> 0xffffffffff600407: syscall pwndbg> 0xffffffffff600409: ret | cs |
여기 보면 ret이 있는데 0xffffffffff600400을 써야한다고 한다.
그래서 0xffffffffff600400 대충 30개쯤 때려박으면 쉘이 따인다 ㄷㄷ
'Pwnable > write up' 카테고리의 다른 글
CSAW 2013 miteegashun(400) (0) | 2018.11.19 |
---|---|
P.W.N ctf exploitClass (0) | 2018.11.18 |
P.W.N ctf write up (0) | 2018.11.04 |
[PlaidCTF 2014] kappa (0) | 2018.09.26 |
[DEFCON 2015] r0pbaby (0) | 2018.09.16 |
댓글