목록리버싱 기초 (76)
Self-Improvement
FILE 적용된 보호기법 IDA Main에서 1129포트로 소켓을 열어주고 있다 sub_8048C65 핵을 실행시키는? passcode가 필요하며 passcode는 "THIS_IS_NOT_KEY_JUST_PASSCODE" 자체적으로 만든 파일 안의 존재하고 있다. 당연히 passcode를 leak을 수행해야 하는데 코드들을 살펴보기 전 스택의 상황은 input | v4 | v5 | passcode로 이루어져 있음으로 v4, v5가 채워져있다는 가정하게 input크기만큼 가득채우면 passcode까지 leak이 발생할 것이다. "target"이라는 문자열을 입력하면 조정값?을 입력하는데 이 조정값이 존재하는 input에서 실수형으로 v5, v4에 채워지게 된다. v4, v5를 채워준 후 "launch" 문..
CODE 1 2 3 4 5 6 7 8 9 10 11 12 13 // gcc -o srop srop.c -fno-stack-protector -mpreferred-stack-boundaey=2 char sh[] = "/bin/sh"; void int80() { asm("int $0x80"); } void main() { char buf[8]; read(0, buf, 128); } Colored by Color Scripter cs int 0x80 가젯과 EAX를 제어할 수 있는 read()함수가 존재하여 SROP가 가능하다. 자세한 사항은 위 참고자료를 확인해본다. read()함수에서 119개의 문자열을 입력하여 EAX를 0x77로 만들어준다. read()함수는 입력한 길이만큼 EAX로 반환되기 때문이다...
FILE ELF 32bit, dynamically linked, stripped 적용된 보호기법 Functions IDA Main 8888포트로 소켓 통신이 이루어진다. 그리고 그림엔 없지만 fork()로 인해 canary는 고정이 되어진다. sub_8048FC6 취약점이 존재하는 함수를 바로 확인해본다. buf 변수는 ebp-0x16이며 canary(ebp-0xC)를 빼면 10바이트크기를 가지고있다. 하지만 read함수에서 110바이트를 읽어들이고 있음으로 BOF가 발생하게 되며 sprintf함수에 의해 memory leak으로 canary까지 구할 수 있을 것으로 보인다. Canary LEAK canary의 뒤 1바이트가 \x00으로 존재한다는 가정하에 11바이트를 전송하여 leak 해본다. 그리고 ..
이번 문제는 base64에 대한 것을 공부하게 되는 계기가 되었다. FILE ELF 64bit, Dynamically linked, stripped 실행 BabyMISC을 실행하게 되면 STAGE 01이 뜨면서 입력값을 받음으로 hello?을 했더니 종료가 되어진다. IDA Main을 확인해 보니 간단하게 3가지의 스테이지가 있는것처럼 보인다. sub_400EA8(STAGE 01) 분석하는 과정에서 name을 재정의를 몇몇 하였다. return 과정에서 True 참이 되면 다음 STAGE로 넘어갈 수 있다. 1. 입력 값과 기존 base64의 길이가 같아야 한다. 2. base64로 decode할 시 값이 같아야 한다. 3. 입력 값은 달라야 한다. base64에 대해 알아야 풀 수 있으며 아래의 링크에..
FILE 파일을 다운로드 받은 후에 정보를 확인해 본다. 32bit, dynamically linked, stripped로 되어있다. 적용된 보호기법 Functions IDA IDA를 통해서 메인과 서브함수들의 중요한 것만 확인해 본다. (Strings 찾기로 접근음) 8181포트로 socket을 열어준다. v2의 크기는 40바이트이지만 입력값을 받을땐 100바이트로 받고 있음으로 1번과 2번 선택에서 BOF가 발생하게 된다. v3= ebp-0xC v2= ebp-0x34 v2의 크기는 0x34-0xC =0x28이다. Main에서 Fork()함수로 인해 Canary는 고정이 되어있을 것이다. 먼저 Canary 값을 구하기 위해 v2의 크기만큼 40바이트를 채워본다. Canary Leak Pwntools로 ..
적용된 보호기법 NX(스택 실행권한 X), ASLR(주소 동적 변환) 파일 정보 ELF 32-bit 실행파일이며 dynamically linked와 stripped로 되어있다. 실행 실행하면 입력값을 받은 후 "WIN"이라는 문자열이 출력이 된다. IDA stripped로 되어있음으로 gdb로 메인을 찾을 수 없지만 IDA로 확인하면 쉽게 알 수있다. (WIN string 찾기 등) main은 0x804841D 주소로 되어있다. 코드로 변환하여 보면 main에서 sub_80483f4(read_sub())를 호출하여 read함수로 입력값을 받고 다시 main에서 write 함수로 "WIN"이 출력된다. read함수에서 0x100만큼 입력할 수 있지만 buf는 0x88크기를 가지므로 BOF가 발생하게 되며 ..
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include #include int main(void){ setvbuf(stdin,0,2,0); setvbuf(stdout,0,2,0); vuln(); } int vuln(void){ char buf[256]; int sel; memset(buf,0,256); while(1){ write(1,">>>",4); scanf("%d",&sel); switch(sel){ case 1:read(0,buf,512); break; case 2:printf("%s\n", buf); break; case 3:return 0; break; } } } Colored by Color Scri..
소스코드 read함수에서 선언한 buf 크기보다 큰 입력값을 받고 있음으로 오버플로우가 가능하다. 적용된 보호기법 NX Bit(스택내에 실행권한 X), ASLR(주소가 동적 변화), Partial RelRO(Got Overwrite O) Python Pwntools 코드 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from pwn import * context.log_level='debug'context(arch='x86', os='linux', endian='little') e=ELF('./rop')p=process('./ro..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include #include void func2(){ system("/bin/sh"); } int main(int argc, char *argv[]){ int num=0; char arr[10]; strcpy(arr, argv[1]); printf("arr: %s\n", arr); return 0; } Colored by Color Scripter cs 소스코드는 간단히 입력받은 값을 strcpy를 수행한 후 printf로 출력하는 것이다. gcc 컴파일 시 Dummy 제거 옵션을 주고 스택 버퍼 오버플로우를 일으키는 것은 쉽지만 그냥 컴파일 시 Dummy와 ret 포인터?가 생겨 오버플로우를 일으키는 방식이 조금 달라지게 되..