from pwn import *
s = ssh(user="col", host="pwnable.kr", port=2222, password="guest")
argv1 = ["" for i in range(2)]
argv1[1] = p32(0x6c5cec8) * 4 + p32(0x6c5cecc)
''' 비효율적이지만 little endian으로 한 바이트씩
argv1[1] = (chr(int(0xc8))+chr(int(0xce))+chr(int(0xc5))+chr(int(0x6)))*4
argv1[1] += (chr(int(0xcc))+chr(int(0xce))+chr(int(0xc5))+chr(int(0x6)))
'''
p = s.process(executable="/home/col/col", argv=argv1)
p.interactive()
-r-sr-x--- 1 col_pwn col 7341 Jun 11 2014 col
-rw-r--r-- 1 root root 555 Jun 12 2014 col.c
-r--r----- 1 col_pwn col_pwn 52 Jun 11 2014 flag
// col 소유자는 col_pwn, setuid 설정되어있으므로 flag 읽을 수 있음
#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;
}
// 20byte char 입력받음
// 4byte씩 16진수로 인식해서 다섯번을 더해서 (little endian!!)
// 그 결과값이 0x21DD09EC (4byte)면 된다!
// 0x6c5cec8*5+0x4 = 0x6c5cec8*4 + 0x6c5cecc 이걸
// 4바이트씩 리틀엔디안으로 다섯번 합쳐서 argv[1]로 보낸다
'security > 포너블 - pwnable.kr' 카테고리의 다른 글
pwnable.kr - [Toddler's Bottle] flag (0) | 2023.02.05 |
---|---|
pwnable.kr - [Toddler's Bottle] fd (0) | 2023.02.05 |
pwnable.kr - [Toddler's Bottle] coin1 (0) | 2023.02.05 |
pwnable.kr - [Toddler's Bottle] cmd2 (0) | 2023.02.05 |
pwnable.kr - [Toddler's Bottle] cmd1 (0) | 2023.02.05 |