목록2020/06 (23)
Self-Improvement
풀이 pwnable.kr/bin/flag에서 파일을 다운로드하여 실행해 본다. malloc()하고 strcpy 수행만 한다고 되어있다. IDA로 열어서 확인해 보면 제대로 분석이 되어지지가 않는다.. 확인을 해보니 UPX로 패킹이 되어있는 것 같다. UPX 언패킹을 수행한 후에 다시한번 분석을 해본다. upx -d ./flag IDA로 다시한번 확인해 보니 정말로 malloc()와 strcpy() 함수만 수행하고 종료가 되어진다. strcpy() 인자로 넘어가는 레지스터 값을 확인해보면 flag 표시가 되어있으며 확인하면 flag 값을 얻을 수 있다.
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } Colored by Color Scripter cs gets()함수에서 bof가 발생하여 key 값이 저장된 주소까지 덮어씌울 수 있다. * func..
소스코드 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 27 28 29 30 31 #include #include unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include #include #include char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc
FILE 적용된 보호기법 IDA input_name의 크기는 (0x20-0x8)로 0x18크기이며 스택의 바로 아래에는 canary가 존재하고 있다. Main함수에서 name을 입력 받을때 read()함수로 0x28크기만큼 받고 있음으로 input_name 변수의 크기보다 0x10바이트 만큼 더 입력 할 수 있음으로 canary leak을 할 수 있다. 그 다음 아래에서 bof에 취약한 scanf() 함수로 문자열을 입력 받고 있음으로 BOF를 수행할 수 있다. 친절하게도 바이너리 파일안에 helper()함수로 system("/bin/sh")이 존재하고 있다. 결론적으론 1. read() 함수에서 canary을 leak 한다. 2. scanf() 함수에서 BOF로 ret 영역에 helper() 함수를 덮..
https://py0zz1.tistory.com/107 Return-to-Csu 기법 정리 포너블 문제를 풀 때, 64Bit 바이너리가 까다로운 이유가 바로 'Gadget' 때문이다. 64Bit의 Calling Convention은 Fastcall로 호출된 함수에 인자를 레지스터로 전달한다. 이 때문에 Exploit을 구성할 때도 [POP R. py0zz1.tistory.com 위 블로그에 잘 나와있다!! 강추 중요한점은 set_csu를 한번만 진행하면 chaning으로 인해 계속 진행이 되어진다.
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로 반환되기 때문이다...