$ file 07_angr_symbolic_file
07_angr_symbolic_file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9415cb30bed985681d385c2ae9292ede963d6895, not stripped
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // ST08_4
bool v4; // cf
bool v5; // zf
signed int v6; // ecx
_BYTE *v7; // esi
const char *v8; // edi
int v9; // [esp-10h] [ebp-2Ch]
int v10; // [esp-Ch] [ebp-28h]
int v11; // [esp-8h] [ebp-24h]
int v12; // [esp-4h] [ebp-20h]
int v13; // [esp+0h] [ebp-1Ch]
signed int i; // [esp+0h] [ebp-1Ch]
memset(&buffer, 0, 0x40u);
printf("Enter the password: ");
__isoc99_scanf("%64s", &buffer, v3, v9, v10, v11, v12, v13);
ignore_me((int)&buffer, 0x40u);
unsigned int __cdecl ignore_me(int a1, size_t n)
{
void *v2; // esp
int v4; // [esp+0h] [ebp-28h]
void *ptr; // [esp+Ch] [ebp-1Ch]
size_t v6; // [esp+10h] [ebp-18h]
void *s; // [esp+14h] [ebp-14h]
FILE *stream; // [esp+18h] [ebp-10h]
unsigned int v9; // [esp+1Ch] [ebp-Ch]
ptr = (void *)a1;
v9 = __readgsdword(0x14u);
v6 = n - 1;
v2 = alloca(16 * ((n + 15) / 0x10));
s = &v4;
memset(&v4, 0, n);
unlink("FOQVSBZB.txt");
stream = fopen("FOQVSBZB.txt", "a+b");
fwrite(ptr, 1u, n, stream);
fseek(stream, 0, 0);
__isoc99_fscanf(stream, "%64s", s);
fseek(stream, 0, 0);
fwrite(s, 1u, n, stream);
fclose(stream);
return __readgsdword(0x14u) ^ v9;
}
unlink(const char *pathname)
alloca() 함수로 할당받고 해당 stack 영역을 가리키는 주소를 v2에 저장한다.
FOQVSBZB.txt 파일 열어서 ptr 값을 0x39만큼 복사한 후, fseek로 파일 시작으로 이동하여 fscanf() 함수로 파일로부터 s에 64바이트만큼 복사한다.
이후 다시 fseek() 함수로 파일 시작으로 이동 후, s의 0x39만큼을 파일에 복사한 후 파일을 닫는다.
memset(&buffer, 0, 0x40u);
fp = fopen("FOQVSBZB.txt", "rb");
fread(&buffer, 1u, 0x40u, fp);
fclose(fp);
unlink("FOQVSBZB.txt");
for ( i = 0; ; ++i )
{
v4 = (unsigned int)i < 7;
v5 = i == 7;
if ( i > 7 )
break;
*(_BYTE *)(i + 134520992) = complex_function(*(char *)(i + 134520992), i);
}
v6 = 9;
v7 = &buffer;
v8 = "OSIWHBXI";
do
{
if ( !v6 )
break;
v4 = *v7 < (const unsigned __int8)*v8;
v5 = *v7++ == *v8++;
--v6;
}
while ( v5 );
if ( (!v4 && !v5) != v4 )
{
puts("Try again.");
exit(1);
}
puts("Good Job.");
exit(0);
}
바이너리는 main 함수 초반에 scanf로 buffer에 입력을 받긴 하지만, ignore_me() 함수에서 FOQVSBZB.txt 파일에 값을 쓴 후, main() 함수로 돌아와 buffer를 초기화 해서 FOQVSBZB.txt 파일에서 0x40바이트 만큼 buffer에 복사한다.
즉, 패스워드에 대한 입력은 FOQVSBZB.txt에 저장되어있다.
이후에는 연산 작업 후 패스워드가 조건과 맞을 경우 “Good Job.”을 출력해준다.
state = p.factory.blank_state(
addr=0x080488B9,
add_options={angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY, angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS}
)
password = state.solver.BVS('password', 64)
filename = 'FOQVSBZB.txt'
password_file = angr.storage.SimFile(filename, content=password)
state.fs.insert(filename, password_file)
#!/usr/bin/python
import angr, sys
# create angr project
p = angr.Project('./07_angr_symbolic_file')
# set start state
state = p.factory.blank_state(
addr=0x080488BF,
add_options={angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY, angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS}
)
# file content (64 bytes)
password = state.solver.BVS('password', 64)
# symbolic file copying it's content to symbolic input(buffers global variable)
filename = 'FOQVSBZB.txt'
password_file = angr.storage.SimFile(filename, content=password)
# add symbolic file(password_file) to filesystem
state.fs.insert(filename, password_file)
# create simluation manager
simgr = p.factory.simgr(state)
# search possible path for solution
simgr.explore(find=lambda s: 'Good'.encode() in s.posix.dumps(sys.stdout.fileno()), avoid=lambda s: 'Try'.encode() in s.posix.dumps(sys.stdout.fileno()))
# if found stash is not empty
if simgr.found:
print('solution state:', end=' ')
print(simgr.found[0])
solution = simgr.found[0].solver.eval(password, cast_to=bytes).decode()
print('solution: ', end=' ')
print(solution)
else:
raise Exception('could not find the solution.')
[EKOPARTY CTF 2016] Fuckzing reverse (ft. angr) (0) | 2022.07.16 |
---|---|
[angr_ctf] 08_angr_constraints (0) | 2022.05.15 |
[angr_ctf] 06_angr_symbolic_dynamic_memory (0) | 2022.05.14 |
[angr_ctf] 05_angr_symbolic_memory (0) | 2022.05.14 |
[angr_ctf] 04_angr_symbolic_stack (0) | 2022.05.14 |