。Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?
Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c
Running at : nc pwnable.kr 9000
将 bof 文件下载下来,用 file 命令查看一下,可以看到是一个32位的 ELF 可执行文件,拖到 Ubuntu 中进行调试。

简单运行发现程序需要我们输入一些字符串,根据提示可以知道此题需要进行溢出。直接抄起 gdb 调试之。尝试直接使用 b main 在主函数处设置断点。

r 开始运行,程序断在了主函数入口处,使用 n 进行单步跟踪,当走到 0x8000069a 处时,程序 call 0x8000062c 调用了 0x8000062c 处的函数,直接 s 单步进入继续跟。

当走到 0x8000064c 程序将寄存器 eax 的值 0xbffff55c 压入栈,随后进行 call 0xb7e78cd0 <_IO_gets>,此处为 c 语言中的 gets() 函数调用,最终 0xbffff55c 会指向用户输入的字符串。这里使用peda中的 pattern create 64 创建一个64字节的测试 payload 将其输入到程序中,方便后续调试。

输入完字符串后,程序停在了 0x80000654 进行了一个简单的比较操作 cmp DWORD PTR [ebp+0x8],0xcafebabe,比较 DWORD PTR [ebp+0x8] 处的值是否等于 0xcafebabe,而此时的 DWORD PTR [ebp+0x8] 地址为 0xbffff590,回顾一下刚刚指向用户输入字符串的地址 0xbffff55c。输入的字符串地址处在一个低地址上,如果输入足够长的字符串,就能够覆盖到后面 0xbffff590 处的值。
当比较成功时,程序不会发生跳转,调用 call 0xb7e54190 <__libc_system>,而其参数为 /bin/sh,如下图。

理清过程后,剩下的就只需要找到输入字符串指针距离 0xbffff590 的偏移即可。由于之前使用了特殊的 payload,这时候我们查看一下输入字符串周围的堆栈情况。

可以看到刚才输入的 payload 已经覆盖到了 0xbffff590 处的值,但是并不是程序需要的 0xcafebabe,使用 pattern offset 来计算偏移。

可以看到,0xbffff590 距离字符串开头的偏移为52个字节,因此为了成功地使程序跳转执行system(“/bin/sh”),我们构造的输入字符串就应该为:
"A" * 52 + "\xbe\xba\xfe\xca"
此时,直接使用命令行远程打 payload:
(python -c 'print "A" * 52 + "\xbe\xba\xfe\xca"'; cat -) | nc pwnable.kr 9000

pwnable.kr-bof的更多相关文章

  1. pwnable.kr bof之write up

    这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: #include <stdio.h> #include <string.h> #include <st ...

  2. 【pwnable.kr】bof

    pwnable从入门到放弃,第三题. Download : http://pwnable.kr/bin/bofDownload : http://pwnable.kr/bin/bof.c Runnin ...

  3. pwnable.kr之bof

    打开题目: 先下载题目给我们的两个文件,查看文件信息: 发现没有执行的权限,所以先增加文件bof的执行权限,执行: 没发现啥,然后查看代码, #include <stdio.h> #inc ...

  4. pwnable.kr第三题bof

    Running at : nc pwnable.kr 9000 IDA查看 1 unsigned int __cdecl func(int a1) 2 { 3 char s; // [esp+1Ch] ...

  5. pwnable.kr第二天

    3.bof 这题就是简单的数组越界覆盖,直接用gdb 调试出偏移就ok from pwn import * context.log_level='debug' payload='A'*52+p32(0 ...

  6. pwnable.kr的passcode

    前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...

  7. pwnable.kr col之write up

    Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnab ...

  8. pwnable.kr brainfuck之write up

    I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...

  9. pwnable.kr login之write up

    main函数如下: auth函数如下: 程序的流程如下: 输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中 mad5_auth()生成其MD5值并与f87cd6 ...

  10. pwnable.kr详细通关秘籍(二)

    i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...

随机推荐

  1. 进程 swoole

    父进程创建子进程,子进程会复制父进程的内存和上下文环境,但是互相独立,如果两个进程是独立的是怎么互相通信的了,可以用共享内存,共享内存不属于任何一个进程,其他进程可以访问共享内存,查下系统的共享内存分 ...

  2. nodejs框架express准备登录

    目录: 安装模板 静态资源 添加视图 渲染视图 url重定向 模板引擎 从本节课程开始我们要使用express框架实现一个简单的用户登陆功能,让我们先准备一下相关资源. 在nodejs中使用expre ...

  3. 自定义属性 view

    首先自定义一个圆,相信以前的学习大家都会画圆,在values下写一些自定义的属性 package com.exaple.day01rikao; import android.content.Conte ...

  4. 查看Linux内核版本命令

    一.查看Linux内核版本命令(两种方法): .cat /proc/version .uname -a 二.查看Linux系统版本的命令(3种方法): .lsb_release -a即可列出所有版本信 ...

  5. SpringMVC 手动控制事务提交

    描述 事务还是一个比较好的东东,有了这个,我们在做流程性的东西的时候,就会很好,很nice. 现在看看 SpringMVC 如何实现的,详细请看代码: 1.配置文件 applicationContex ...

  6. php + Bootstrap-v3-Typeahead 自动完成组件的使用

    Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,类似百度.谷歌等搜索提示:输入关键词出现相应的下拉列表数据. 是Bootstrap-3-Typeah ...

  7. python发送邮件方法

    1.普通文本邮件 #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.mime.text import MIM ...

  8. 用CSS3实现文字描边

    CSS3作为新兴的前端技术可以实现很多复杂变化的效果,比如文字描边. 这里主要用到text-shadow属性,顾名思义就是为文字加上阴影效果.例: text-shadow:10px 5px 2px # ...

  9. string类find函数返回值判定

     string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int m ...

  10. rmi远程调用

    1.在服务器端程序中的spring-servlet.xml中添加 <bean id="userService" class="org.springframework ...