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

from pwn import * from LibcSearcher import LibcSearcher context(arch='i386', os='linux', log_level='debug') io = connect('node5.buuoj.cn',29724) # 与在线环境交互。 #_______________需要用到的地址区包括offset_____________________ leak_func = 0x08048474 main_addr = 0x080484C6 offset1 = 0x88 + 4...

payload: padding1 + address of system() + padding2 + address of “/bin/sh” padding1 处的数据可以随意填充(注意不要包含 “\x00” , 否则向程序传入溢出数据时会造成截断) 长度应该刚好覆盖函数的基地址 padding2 处的数据长度为4(32位机),对应调用 system() 时的返回地址。 因为我们在这里只需要打开 shell 就可以,并不关心从 shell 退出之后的行为,所以 padding2 的内容可以随意填充。 p64(elf.got['puts']): 参数1 - puts函数的GOT表地址 p64(elf.sym['puts']):...

system 在Linux中,system()函数调用后,传入的参数(如"/bin/sh"字符串地址)通常存储在RDI寄存器中。