git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/pwntcha/trunk@400 92316355-f0b4-4df1-b90c-862c8a59935fmaster
@@ -3,7 +3,15 @@ NULL = | |||||
bin_PROGRAMS = pwntcha | bin_PROGRAMS = pwntcha | ||||
pwntcha_CFLAGS = $(ADDITIONAL_CFLAGS) -Wall -O6 | pwntcha_CFLAGS = $(ADDITIONAL_CFLAGS) -Wall -O6 | ||||
pwntcha_LDFLAGS = $(ADDITIONAL_LDFLAGS) | pwntcha_LDFLAGS = $(ADDITIONAL_LDFLAGS) | ||||
pwntcha_SOURCES = main.c image.c filters.c common.h slashdot.c phpbb.c test.c | |||||
pwntcha_SOURCES = \ | |||||
main.c \ | |||||
image.c \ | |||||
filters.c \ | |||||
common.h \ | |||||
phpbb.c \ | |||||
scode.c \ | |||||
slashdot.c \ | |||||
test.c | |||||
if USE_OPENCV | if USE_OPENCV | ||||
ADDITIONAL_CFLAGS = `opencv-config --cflags` | ADDITIONAL_CFLAGS = `opencv-config --cflags` | ||||
@@ -31,12 +31,11 @@ int debug = 1; | |||||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
{ | { | ||||
char *mode = "auto"; | char *mode = "auto"; | ||||
argv0 = argv[0]; | |||||
int c; | int c; | ||||
int digit_optind = 0; | int digit_optind = 0; | ||||
argv0 = argv[0]; | |||||
for(;;) | for(;;) | ||||
{ | { | ||||
int this_option_optind = optind ? optind : 1; | int this_option_optind = optind ? optind : 1; | ||||
@@ -122,6 +121,8 @@ int main(int argc, char *argv[]) | |||||
result = decode_test(img); | result = decode_test(img); | ||||
else if(!strcmp(mode, "phpbb")) | else if(!strcmp(mode, "phpbb")) | ||||
result = decode_phpbb(img); | result = decode_phpbb(img); | ||||
else if(!strcmp(mode, "scode")) | |||||
result = decode_scode(img); | |||||
else if(!strcmp(mode, "slashdot")) | else if(!strcmp(mode, "slashdot")) | ||||
result = decode_slashdot(img); | result = decode_slashdot(img); | ||||
else | else | ||||
@@ -131,6 +132,11 @@ int main(int argc, char *argv[]) | |||||
dprintf("autodetecting phpBB captcha\n"); | dprintf("autodetecting phpBB captcha\n"); | ||||
result = decode_phpbb(img); | result = decode_phpbb(img); | ||||
} | } | ||||
else if(img->height == 25) | |||||
{ | |||||
dprintf("autodetecting scode captcha\n"); | |||||
result = decode_scode(img); | |||||
} | |||||
else if(img->height == 69) | else if(img->height == 69) | ||||
{ | { | ||||
dprintf("autodetecting slashdot captcha\n"); | dprintf("autodetecting slashdot captcha\n"); | ||||
@@ -0,0 +1,144 @@ | |||||
/* | |||||
* scode.c: decode scode captchas | |||||
* $Id$ | |||||
* | |||||
* Copyright: (c) 2004 Sam Hocevar <sam@zoy.org> | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the Do What The Fuck You Want To | |||||
* Public License as published by Banlu Kemiyatorn. See | |||||
* http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include "config.h" | |||||
#include "common.h" | |||||
static char find_glyph(struct image *img, int xmin, int xmax); | |||||
/* Main function */ | |||||
char *decode_scode(struct image *img) | |||||
{ | |||||
char *result; | |||||
int stats[256]; | |||||
int x, y, i, incell = 0, cur = 0, xmin = 0; | |||||
int r, g, b; | |||||
struct image *tmp1; | |||||
/* allocate enough place */ | |||||
result = malloc(1024 * sizeof(char)); | |||||
/* Detect background: first 3 lines */ | |||||
for(i = 0; i < 256; i++) | |||||
stats[i] = 0; | |||||
for(y = 0; y < 3; y++) | |||||
for(x = 0; x < img->width; x++) | |||||
{ | |||||
getpixel(img, x, y, &r, &g, &b); | |||||
stats[r]++; | |||||
} | |||||
/* Set non-background colours to 0 */ | |||||
tmp1 = image_new(img->width, img->height); | |||||
for(y = 0; y < img->height; y++) | |||||
for(x = 0; x < img->width; x++) | |||||
{ | |||||
getpixel(img, x, y, &r, &g, &b); | |||||
if(stats[r]) | |||||
setpixel(tmp1, x, y, 255, 255, 255); | |||||
else | |||||
setpixel(tmp1, x, y, 0, 0, 0); | |||||
} | |||||
/* Decode glyphs */ | |||||
for(x = 0; x < img->width; x++) | |||||
{ | |||||
int found = 0; | |||||
for(y = 0; y < img->height; y++) | |||||
{ | |||||
getpixel(tmp1, x, y, &r, &g, &b); | |||||
if(!r) | |||||
{ | |||||
found = 1; | |||||
break; | |||||
} | |||||
} | |||||
if(found && !incell) | |||||
{ | |||||
incell = 1; | |||||
xmin = x; | |||||
} | |||||
else if(!found && incell) | |||||
{ | |||||
incell = 0; | |||||
/* Find glyph */ | |||||
result[cur++] = find_glyph(tmp1, xmin, x); | |||||
} | |||||
} | |||||
image_free(tmp1); | |||||
result[cur] = 0; | |||||
return result; | |||||
} | |||||
static char find_glyph(struct image *img, int xmin, int xmax) | |||||
{ | |||||
int ymin = -1, ymax = -1; | |||||
int x, y, count = 0; | |||||
int r, g, b; | |||||
/* Compute vertical bounds of glyph */ | |||||
for(y = 0; y < img->height; y++) | |||||
{ | |||||
int found = 0; | |||||
for(x = xmin; x < xmax; x++) | |||||
{ | |||||
getpixel(img, x, y, &r, &g, &b); | |||||
if(!r) | |||||
{ | |||||
found = 1; | |||||
break; | |||||
} | |||||
} | |||||
if(found) | |||||
{ | |||||
if(ymin == -1) | |||||
ymin = y; | |||||
else | |||||
ymax = y + 1; | |||||
} | |||||
} | |||||
for(x = xmin; x < xmax; x++) | |||||
{ | |||||
for(y = ymin; y < ymax; y++) | |||||
{ | |||||
getpixel(img, x, y, &r, &g, &b); | |||||
if(!r) | |||||
count += y - ymin; | |||||
} | |||||
} | |||||
switch(count) | |||||
{ | |||||
case 162: return '0'; | |||||
case 131: return '1'; | |||||
case 150: return '2'; | |||||
case 139: return '3'; | |||||
case 155: return '4'; | |||||
case 159: return '5'; | |||||
case 181: return '6'; | |||||
case 90: return '7'; | |||||
case 180: return '8'; | |||||
case 170: return '9'; | |||||
default: | |||||
dprintf("don't know about checksum %i\n", count); | |||||
return '?'; | |||||
} | |||||
} | |||||
@@ -34,7 +34,7 @@ int objects, first, last; | |||||
char *result; | char *result; | ||||
/* Main function */ | /* Main function */ | ||||
char * decode_slashdot(struct image *img) | |||||
char *decode_slashdot(struct image *img) | |||||
{ | { | ||||
struct image *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; | struct image *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; | ||||
@@ -28,7 +28,7 @@ int objects, first, last; | |||||
char *result; | char *result; | ||||
/* Main function */ | /* Main function */ | ||||
char * decode_test(struct image *img) | |||||
char *decode_test(struct image *img) | |||||
{ | { | ||||
struct image *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; | struct image *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; | ||||