Access Control 在pwn.college网站做Access Control部分前16题的记录。
1. 运行run发现要求flag文件权限,用ll查看flag权限发现能够读取,cat /flag查看。
2. 用ll查看flag权限发现能够读取,cat /flag查看。
3. 用ll命令发现flag文件变得没有任何权限,因此添加权限:
chmod +r flag
cat flag
4. 用ll查看flag权限发现满足要求,cat /flag查看。
5. 在/tmp用touch创建flag空文件,然后复制过来:
cp /flag /tmp/flag
此时覆盖了文件的数据内容,但文件属性和权限没有改变,可以cat出来。
6. 将hacker用户加入用户组:
usermod -aG group_xxx hacker
su hacker
cat /flag
7. 登录有读取flag权限的其他用户:
su user_qlurihvb
然后输入密码,就能cat flag。
8. 同样用su命令,登录创建文件的用户即可。
9. 本题要求理解多用户下的文件权限以及用su获取合适的用户来执行对应权限。题目给予的用户拥有flag的读取权限,于是同样用su命令,登录该用户即可获取flag。
10. 本题要求学会查看什么用户属于什么组。
只有“创建者所属组内的其他用户”对flag文件有读取权限,因此需要在给定的一系列用户中找到和root同为group_nwu的。
输入命令查看所有组信息:
cat /etc/group
输入命令:
su user_khbqhkai
输入对应密码即可获取flag。
11. 题目说已经将flag放在tmp目录下,并给了两个用户及其密码。观察发现tmp目录下只有一个文件夹是我们有权限的,登录第一个用户可以打开该文件夹。进入后用ls -l命令查看发现里面有一个文件,应为flag,需要切换到第二个用户才能读取它,即可获得flag。
12. 原理和上一题一样,只是嵌套的用户从两个变成了三个。
13. 本题考查强制访问控制机制,主体和客体均被赋予了相应的安全级别L=(C,S),其中C表示安全等级,S是类别集。安全等级从高到低分为4级:绝密(TS)、机密(S)、秘密(C)和非密(U)。
对于两个安全级别L1=(C1,S1)与L2=(C2,S2),定义:
L1≥L2,当且仅当C1≥C2,S2⊆S1
L1>L2,当且仅当C1>C2,S2⊂S1
L1<L2,当且仅当C1<C2,S1⊂S2
L1≤L2,当且仅当C1≤C2,S1⊆S2
如果L1和L2的关系都不属于以上情况,则其不可比较。
绝密级可以写绝密级,回答yes得到flag。
14. 本题回答强制访问控制机制的五个问题。总结:同等级之间可以读写,不同等级之间要记住信息只能从低级流向高级,即:高级只能读低级,低级只能写高级。
15. 本题中,同为TS级,类别互不包含,因此不可比较,互相之间没有读写权限,回答no得到flag。
16. 本题回答强制访问控制机制的五个问题。总结:要记住信息只能从低级流向高级,从大的类别集合流向其子集的类别集合。五个问题全回答no得到了flag。
cryptography 在pwn.college网站做cryptography部分前8题的记录。
1.XOR 要求算出170和51的异或值。代码如下:
1 2 3 4 a = 170 b = 51 result = hex (a ^ b) print (result)
得到结果为153。
2.Hex 本题要求对16进制的数进行异或计算。代码如下:
1 2 3 4 a = 0x18 b = 0x79 result = hex (a ^ b) print (result)
计算9次结果后得到flag。
3.ASCII 代码与上一题一致,只需在开始对应ascii码表将ascii码转为十六进制作为输入即可。回答9个问题后得到flag。
4.ASCII Strings 代码如下:
1 2 3 from Crypto.Util.strxor import strxorresult = strxor(b"omiCtCWmWk" , b"$#&$$(&#&!" ) print (result)
回答9个问题后得到flag。
5.One-Time Pad 将密文和密钥进行base64解码再进行一次异或即可得到flag。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import base64def base64_to_str (base64_string ): byte_data = base64.b64decode(base64_string) string_data = byte_data.hex () return string_data a = base64_to_str("4pNtP31oGHe9Cg4D/CbNR0UXYgqB/5Spbl+MJu77R3PxpgmOuCDVt5hQhKPjnKqyWRGEDqskQVPG8A==" ) b = base64_to_str("kuQDER4HdBvYbWt4tR6Md3BfGnnFptL+NGmhd7eCMzGH6EHkwnbmmfwC/u2Z0e7+LnbuQNJPOwS7+g==" ) result = 0xe2936d3f7d681877bd0a0e03fc26cd474517620a81ff94a96e5f8c26eefb4773f1a6098eb820d5b7985084a3e39caab25911840eab244153c6f0 ^ 0x92e403111e07741bd86d6b78b51e8c77705f1a79c5a6d2fe3469a177b782333187e841e4c276e699fc02feed99d1eefe2e76ee40d24f3b04bbfa result = "70776e2e636f6c6c6567657b4938413035487873445946575a362d5159797442764e486a7a56332e64527a4e7a4d444c77676a4e796b7a577d0a" output = '' i = 0 while (True ): if i >= len (result): break tmp = result[i:i+2 ] output += (chr (int (tmp,16 ))) i+=2 print (output)
6.many-Time Pad 任何数与0异或会得到其本身,输入与flag同样长度的全0表示的base64码:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
输出的密文即为密钥的base64码。解密代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import base64from Crypto.Util.strxor import strxordef base64_to_hex (base64_string ): byte_data = base64.b64decode(base64_string) return byte_data def hex_ascii (hex_data ): output = '' i = 0 while (True ): if i >= len (hex_data): break tmp = hex_data[i:i + 2 ] output += (chr (int (tmp, 16 ))) i += 2 return output a = base64_to_hex("LH1+aEbGZnOwx07kX76Xc4Ga32knwPzMuPbqCqYjypK/e3Ph+t0Qqb9THqEy7TJqL/Q/LNzaRVicwg==" ) b = base64_to_hex("XAoQRiWpCh/VoCufGtTwEe7zuSpgjJStyMWhOOplmeOKDCq1tqdWh9sFZO9IoHYmWJNVYqWxPw/hyA==" ) result = strxor(a, b).hex () print (result)result = hex_ascii(result) print (result)
7.AES 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import sysfrom Crypto.Cipher import AESimport base64ciphertext = base64.b64decode("FfeV48OOpCKwvhtqEEDFxVAnnDx6taB9ydGO1/rUmTtXqq3Slltqni3ZzvKysnAfLpBherWAcszMw3C4M+0Neg==" ) aes_key = base64.b64decode('Cta2eDbBOP1WmV81xkWYdQ==' ) cipher = AES.new(aes_key, AES.MODE_ECB) try : message = cipher.decrypt(ciphertext) except ValueError: print ("The message was modified!" ) sys.exit(1 ) print ("Message:" , message.decode())
8.AES-ECB-CPA 可以进行选择明文攻击。选择明文输入,选择长度永远为1,将所有单个字符加密后的输出记录下来,挨个爆破出flag内容。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 from pwn import *context(arch="amd64" , os="linux" , log_level="info" ) challenge_path = "/challenge/run" p = process(challenge_path) dir = {}strin = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm{}1234567890.+-*/=_" for s in strin: print (s) res = p.recvuntil("e?" , drop=False ) print (res) p.sendline("1" ) p.sendline(s) r = p.recvline(keepends=False ) word = r.decode(encoding='utf-8' ).split(': ' )[1 ] print (word) dir [word] = s flag = "" for i in range (100 ): res = p.recvuntil("e?" , drop=False ) p.sendline("2" ) p.sendline(str (i)) p.sendline("1" ) r = p.recvline(keepends=False ) word = r.decode(encoding='utf-8' ).split(': ' )[1 ] print (word) if (word not in dir ): break flag += dir [word] print (flag)
Intercepting Communication 在pwn.college网站做Intercepting Communication部分前10题的记录。
1. 用命令:nc 10.0.0.3 31337 pwn.college{gD40vedatQQZJwLHPd5oPJpL97M.dlTNzMDLwgjNykzW}
2. 用命令:nc -l 31337 pwn.college{gog0K4zdJ_HrSYsLPdNuoe4-poX.dBjNzMDLwgjNykzW}
3. 用命令:nmap 10.0.0.0/24
扫描子网网段。
nc 10.0.0.118 31337 pwn.college{kL-pgnb98gySRorBDpYfFb2r5Hm.dFjNzMDLwgjNykzW}
4. 用命令:nmap –min-parallelism 6000 10.0.0.0/16
快速扫描子网网段中大量ip
nc 10.0.135.47 31337 pwn.college{YM8NPTSO1kaGtqBABZcl4J6pI2t.dJjNzMDLwgjNykzW}
5. 打开wireshark,点击31337端口的tcp流量,追踪流得到flag。
pwn.college{kVTKxZhp0Pf6Hq4Dw9DZ5Jhwe9W.dNjNzMDLwgjNykzW}
6. 打开wireshark监听流量,追踪流,可以看到缓慢发出的flag。
由于打开wireshark需要时间,所以流0的信息不完整,等待一段时间后可以看流1得到完整数据。筛选单方向发送的信息得到flag:
pwn.college{0H9EBMigWUGyl0LAS2DYmzVzlsm.dRjNzMDLwgjNykzW}
7. ip route show查看路由
用命令给自己添加ip路由表:
ip address add 10.0.0.2/24 dev eth0
监听31337端口:
nc -l 31337
pwn.college{kL7-vqtqC9_9gh9fvgnRP1DD6mz.dVjNzMDLwgjNykzW}
8. 需要用scapy库构建数据包。首先获取物理地址:
ip a
输入python进入控制台,输入命令:
1 2 from scapy.all import *sendp(Ether(src="02:42:0a:21:6b:08" ,type =0xFFFF )/IP(src="10.33.107.8" ,dst= "10.0.0.3" ),iface="eth0" )
pwn.college{gwYcjx3cMASXlVyDcsk2ODoOBO1.dZjNzMDLwgjNykzW}
9. 与上一题同样输入python进入控制台,输入命令:
1 2 from scapy.all import *sendp(Ether(src="a2:76:75:f2:ce:5f" )/IP(src="10.33.107.8" ,dst= "10.0.0.3" ,proto=0xff ),iface="eth0" )
pwn.college{gHoiqWidLDmTgVpGfJRnw3rNr1-.ddjNzMDLwgjNykzW}
10. 与上一题同样输入python进入控制台,输入命令:
1 2 from scapy.all import *sendp(Ether(src="a6:d6:77:aa:91:f9" )/IP(src="10.33.107.8" ,dst= "10.0.0.3" )/TCP(sport=31337 ,dport=31337 ,seq=31337 ,ack=31337 ,flags='APRSF' ),iface="eth0" )
pwn.college{gHoiqWidLDmTgVpGfJRnw3rNr1-.ddjNzMDLwgjNykzW}
Assembly Crash Course 在pwn.college网站做Assembly Crash Course部分的记录,由于做的时候没有记录,且都是写汇编语言,个人认为不好标注,因此没有什么描述,仅供参考思路。
average 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,0 mov r8,1 mov rcx,0 mov r9,rdi cmp r8,rsi ja done o: add rax,[r9] add r9,8 add r8,1 cmp r8,rsi jna o div rsi done: nop ''' ))print (p.recvallS())
bitwise-and 1 2 3 4 5 6 7 8 9 10 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' and rax,0 or rax,rdi and rax,rsi ''' ))print (p.recvallS())
1 2 3 4 5 6 7 8 9 10 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,rdi shl rax,0x0018 shr rax,0x0038 ''' ))print (p.recvallS())
check-even 1 2 3 4 5 6 7 8 9 10 11 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' and rax,0x0000 or rax,0x0001 and rax,rdi xor rax,0x0001 ''' ))print (p.recvallS())
cmp if [x] is 0x7f454c46: y = [x+4] + [x+8] + [x+12] else if [x] is 0x00005A4D: y = [x+4] - [x+8] - [x+12] else: y = [x+4] * [x+8] * [x+12]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov esi,[rdi+4] mov ebx,[rdi+8] mov ecx,[rdi+12] mov eax,[rdi] cmp eax,0x7f454c46 je short s cmp eax,0x00005A4D je a mov eax,esi imul eax,ebx imul eax,ecx jmp done a: mov eax,esi sub eax,ebx sub eax,ecx jmp done s: mov eax,esi add eax,ebx add eax,ecx jmp done done: nop ''' ))print (p.recvallS())
most_common_byte most_common_byte(src_addr, size): i = 0 while i <= size-1: curr_byte = [src_addr + i] [stack_base - curr_byte] += 1 i += 1
b = 0 max_freq = 0 max_freq_byte = 0 while b <= 0xff: if [stack_base - b] > max_freq: max_freq = [stack_base - b] max_freq_byte = b b += 1
return max_freq_byte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' push rbp mov rbp, rsp sub rsp, 256 mov r9,0 ;i=0 loop1: mov r8,[rbp+r9] mov r10,rbp add r9,1 cmp rdi,0 je done loop: mov rbx,0 mov bl,[rdi] cmp rbx,0 je done cmp bl,0x5a ja s mov rsi,rdi mov dil,bl call r8 mov rdi,rsi mov [rdi],al add r9,1 s: add rdi,1 jmp loop done: mov rax,r9 ret ''' ))print (p.recvallS())
count non zero 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,rdi test rdi, rdi jz done loop: mov rbx,0 mov bl,[rax] add rax,1 cmp rbx,0 jne loop sub rax,1 done: sub rax,rdi ''' ))print (p.recvallS())
efficient-modul0 1 2 3 4 5 6 7 8 9 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov al, dil mov bx, si ''' ))print (p.recvallS())
endian 1 2 3 4 5 6 7 8 9 10 11 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax, 0xdeadbeef00001337 mov [rdi], rax mov rax, 0xc0ffee0000 mov [rsi], rax ''' ))print (p.recvallS())
increment 1 2 3 4 5 6 7 8 9 10 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,[0x404000] mov r9,0x1337 add [0x404000],r9 ''' ))print (p.recvallS())
indirect 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' cmp rdi,4 jnb o mov rax,rdi imul rax,8 add rax,rsi jmp [rax] o: jmp [rsi+0x20] ''' ))print (p.recvallS())
jump 1 2 3 4 5 6 7 8 9 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,0x403000 jmp rax ''' ))print (p.recvallS())
memread 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rdx,[0x404000] mov eax,[0x404000] mov rcx,rax mov rax,0 mov ax,[0x404000] mov rbx,rax mov rax,0 mov al,[0x404000] ''' ))print (p.recvallS())
memsum 1 2 3 4 5 6 7 8 9 10 11 12 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,[rdi] mov r9,rax mov eax,[rdi+8] add rax,r9 mov [rsi],rax ''' ))print (p.recvallS())
setupper 1 2 3 4 5 6 7 8 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov ah,0x42 ''' ))print (p.recvallS())
stack 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov rax,[rsp] mov r8,[rsp+8] mov r9,[rsp+0x10] mov r10,[rsp+0x18] add rax,r8 add rax,r9 add rax,r10 mov r8,4 div r8 push rax ''' ))print (p.recvallS())
strlow str_lower(src_addr): i = 0 if src_addr != 0: while [src_addr] != 0x00: if [src_addr] <= 0x5a: [src_addr] = foo([src_addr]) i += 1 src_addr += 1 return i
src_addr————rdi return————rax.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' mov r9,0 mov r8,0x403000 cmp rdi,0 je done loop: mov rbx,0 mov bl,[rdi] cmp rbx,0 je done cmp bl,0x5a ja s mov rsi,rdi mov dil,bl call r8 mov rdi,rsi mov [rdi],al add r9,1 s: add rdi,1 jmp loop done: mov rax,r9 ret ''' ))print (p.recvallS())
tranpoline 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from pwn import *context.arch='amd64' p=process('/challenge/run' ) p.recvline() p.send(asm(''' jmp short s .rept 0x51 nop .endr s: pop rdi mov rax,0x403000 jmp rax ''' ))print (p.recvallS())