목록분류 전체보기 (553)
Self-Improvement
32bit는 cdecl, 64bit는 fastcall cdecl은 스택으로 인자를 전달 fastcall은 레지스터로 인자를 전달 (6개의 인자(RDI, RSI, RDX, RCX, R8, R9)는 레지스터로, 그 외의 인자는 스택) FILE 64bit, dynamically linked, not stripped 적용된 보호기법 NX, ASLR IDA Main에서는 크게 봐야할 부분은 my_turn과 your_turn 함수밖에 없는 것 같다. your_turn buf의 크기는 176바이트이지만 read()함수에서 400바이트를 입력 받아 bof가 발생하여 여기서 ROP를 수행하면 될 것 같다. 64bit 임으로 buf(176)+SFP(8)=ret까지 접근할 수 있다. ROP를 위한 가젯 구하기 ELF 64b..
Fake EBP는 RET 이후로 덮어쓰기가 불가능 할때, 또는 RET 자리에 스택/라이브러리 주소가 필터링이 될 때 사용할수 있는 기법중에 하나이다. (NX 보호기법이 걸려있으면 불가능) 에필로그 leave mov esp, ebp pop ebp ret pop eip jmp eip Fake EBP 로직 쉽게 말하자면 RET에 Leave-ret 가젯 주소를 덮어씌어서 leave를 2번 수행을 하는 것이며 SFP에는 주입할 쉘코드 주소의 -4(buf-4) 주소를 넣으면 된다. 코드 1 2 3 4 5 6 7 8 9 10 11 #include int main(int argc, char *argv[]) { char buf[12]; strcpy(buf, argv[1]); puts(buf); return 0; } Co..
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..