목록전체 글 (120)
또 뭐하지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/VoHtg/btsHy0C7Nxo/KiprYSY0QSJAphjQeT15b1/img.png)
풀이// Name: r2s.c// Compile: gcc -o r2s r2s.c -zexecstack#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}int main() { char buf[0x50]; init(); printf("Address of the buf: %p\n", buf); printf("Distance between buf and $rbp: %ld\n", (char*)__builtin_frame_address(0) - buf); printf("[1] Leak the canary\n"); printf("Input: "); fflush(stdout); read(0..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/c0HdSs/btsHuww1bOY/FTkVgl5iCIVrUTIJ1DcLRk/img.png)
풀이#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30);}void read_flag() { system("cat /flag");}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0;}소스코드를 살펴보면 buf 크..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bcVeNw/btsHwt6FeBf/smJI6gXprMUGFBTiaWat5k/img.png)
풀이주어진 바이너리를 실행시켜 보면 어떤 값이 나오고 입력을 받는다. 소스코드를 확인해보자. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30);}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); s..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ceZSQv/btsGwhAcmJ3/zKXT7mMk3v2l3jBK0fIwV0/img.png)
풀이// Name: rao.c// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL);}int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0;}제공된 코드를 살펴보자.buf 크기는 0x28인데 scanf를 통해 입력받는 buf 크기에 제한..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/lBk5V/btsHvuMagHt/K8NGYcbbEYJJNSdvnrZKL0/img.png)
풀이제공된 html 파일에 들어가서 내 생일을 입력해보았다. 아쉽게도 정답이 아니다.6자리 정도면 brute force도 나쁘지 않을 것 같지만 일단 소스코드를 살펴보자. confrim 버튼을 누르면 어떤 일이 발생하는지 요소 버튼을 통해 확인해보니, 입력한 값이 _0x9a220 함수로 넘어가는 것을 확인할 수 있었다.sources 탭을 통해 _0x9a220 함수를 찾아봤는데 하나도 알아볼 수 없었다.그냥 brute force를 하기로 하자.일단 방해가 되는 return alert('Wrong') 부분을 return 0가 되도록 원본 파일을 수정해주었다.for (var y = 0; y 그리고 코드를 작성하여 console 창에 입력했다. 한참 기다린 뒤에야 값이 나왔다. 그리고 화면에 떠있는 flag를 ..
1. Calling Convention함수 호출 규약함수 호출 규약 : 함수의 호출 및 반환에 대한 약속호출자 : 프로그래밍에서 다른 함수 또는 메서드를 호출하는 주체. 쉽게 말해, 호출자는 특정 함수 또는 메서드를 실행하도록 명령한 코드 부분을 가리킴.함수를 호출할 때는 반환된 이후를 위해 호출자의 상태 및 반환 주소를 저장해야함또한, 호출자는 피호출자가 요구하는 인자를 전달해줘야하고, 피호출자의 실행이 종료될 때는 반환값을 전달받아야 함함수 호출 규약의 종류컴파일러는 지원하는 호출 규약 중에서 CPU의 아키텍처에 적합한 것을 선택x86(32bit) 아키텍처 -> 레지스터 수 적음 -> 스택으로 인자 전달하는 규약 사용x86-64 아키텍처 -> 레지스터 수 많음 -> 적은 인자는 레지스터만, 많은 인자..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/r4cA8/btsHpRzv1BZ/ROZAF5ctzkpufAUdYVjY7k/img.png)
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.함수를 살펴보면 일단 문자열 a1의 길이는 8의 배수여야 한다. 그리고 이 문자열을 8바이트 단위로 sub_1400010A0 함수에 넘겨준다. 이제 sub_1400010A0 함수를 확인해보자.byte_140004020[(unsigned __int8)v5[j] ^ v2]는 v5[j]와 v2를 XOR 연산하고, 그 결과를 인덱스로 사용하여 byte_140004020에서 값을 가져온다. 그 가져온 값을 b라고 할 때 a1[(j+1)%8]과 더한 다음 그 값을 5만큼 right rotate 해준다. 그 값을 다시 a1[(j+1)%8]에 넣어준다ubk_140004000와 byte_140004020 값을 얻어오자. #ubk_140004000..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b2Rt37/btsHr0RvHWT/jLmtMTxyG8k5gPETifj300/img.png)
문제 코드를 살펴보면 scanf("%s",A)에서 입력된 문자열을 변수 'A'에 저장하는데, 이때 길이에 대한 제한이 없다. 따라서 지정된 문자열 길이인 8을 넘기게 되면 변수 'B'의 메모리 영역에 덮어써지게 된다. 이제 어셈블리 코드를 살펴보자. : endbr64 // int main() : push rbp : mov rbp,rsp : sub rsp,0x20 //canary 저장 : mov rax,QWORD PTR fs:0x28 : mov QWORD PTR [rbp-0x8],rax // eax 0으로 초기화 : xor eax,eax // 지역 변수 'A' 초기화, 입력을 받아 'A'에 저장 ..