system hacking 28

Layer7 포너블 2차시 과제 - change_ret32 풀이

파일을 다운받아 아이다로 열어보았다. vuln이라는 함수가 보여 거기로 들어가봤다. 20바이트짜리 s 배열을 선언해줬고, 입력을 받고 있었다. 그러나, 배열의 크기는 20바이트인데, fgets에선 80바이트만큼 입력받고 있었고, 여기서 취약점이 터진다는 사실을 알아냈다. 다른 코드 로직이 보이지 않는 걸로 보아 vuln 함수의 ret 주소를 변조해 vuln에서 리턴할 때 쉘을 실행시키는 함수로 이동해야하는 것 같았는데, 마침 win이라는 수상한 함수가 보였다. 그래서 내용을 확인해보니, 역시 쉘을 실행시키는 코드가 탑재되어 있었다. 따라서 win의 주소값으로 vuln함수의 ret주소를 변조하면 문제가 풀릴 것이다. win의 주소값은 어셈블리어 코드로 변환해 구했다. 한 번 페이로드를 구성해보자. send..

system hacking 2022.09.21

Layer7 포너블 2차시 과제 - overwrite_variable64 풀이

일단 문제파일을 아이다로 열어 C로 디컴파일 해보았다. v4에 문자열을 입력받으면서 s1까지 오버플로우시켜 s1 문자열에 PwnPwnPwnPwnPwnPwnPwnPwn이 들어있게 하는 문제였다. 이번에도 어셈블리어로 정확한 위치를 파악해보도록 하겠다. v4(var_40) 변수는 ebp와 0x40만큼 떨어진 곳에 위치해있고, s1은 ebp와 0x20만큼 떨어진 곳에 위치해있다. 따라서 우린 32바이트의 dummy값을 넣어주고, Pwn*8을 덧붙여주면 된다. 그럼 s1에 PwnPwnPwnPwnPwnPwnPwnPwn이라는 문자열이 들어가게 될 것이다. 한 번 페이로드를 구성해보자. 이런 식으로 32바이트의 dummy를 보내주고 Pwn*8을 넣어 공격을 시도했다. 한 번 제대로 먹히는지 실행해보자. 익스플로잇에 ..

system hacking 2022.09.20

Layer7 포너블 2차시 과제 - overwrite_variable32 풀이

일단 문제파일을 내려받아 아이다로 디컴파일해보았다. s에 입력을 받을 때 버퍼 길이보다 더 큰 값을 입력해 s1에 PwnPwnPwnPwnPwnPwnPwnPwn이라는 문자열이 들어있게 하는 문제였다. 일단 C코드로 보는 건 버퍼 길이 계산할 때 부정확할 수 있으니 직접 어셈블리어를 보면서 크기를 계산해주었다. s는 ebp로부터 0x28만큼 떨어진 곳에 위치해 있었고, s1은 0x14만큼 떨어진 곳에 위치해 있었다. 그러므로 20바이트의 더미값 + Pwn*8을 입력해주면 위의 strcmp 조건문을 통과하면서 쉘을 따낼 수 있을 것이다. 한 번 페이로드를 구성해보자. sendlineafter의 두 번째 인자에 넣어준 값을 보면, 20바이트의 dummy + Pwn * 8을 보내주었고, 마지막에 interacti..

system hacking 2022.09.20

Layer7 리버싱 1차시 과제 - dreamhack.io basic_exploitation_001

일단 c코드와 바이너리 파일을 다운받고 c코드부터 열어 어떤 내용의 코드인지 확인했다. #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; ..

system hacking 2022.09.19

Layer7 포너블 1차시 과제 - pwnable.kr bof 문제 풀이

일단 문제 파일을 우분투에서 wget으로 받고 c코드부터 열어보았다. #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; } overflow 버퍼에 입력받을 때 함수의 인자로 들어간 key를 오버플로우 시키는 문제였다. 따라서 key와 overflowme의 정확한 주소차를 계산하는 것이 필요했으며,..

system hacking 2022.09.19

Layer7 포너블 1차시 과제 - bof_basic_64

일단 파일을 다운받고 ida64로 열어보았다. scanf를 쓰는 것을 보아 버퍼 오버플로우인 것을 알 수 있었다. 그런데 문제점이 있다. 바로 오버플로우시킬 변수가 따로 없다는 것이다. 따라서 우리는 main함수의 리턴 주소를 변조해 기존 rip를 바꿔 main함수를 리턴할 때 완전히 다른 코드가 실행될 수 있도록 해주어야 한다. 그러기 위해서 일단 쉘코드를 실행시키는 함수를 찾아보았다. callMeMaybe라는 함수가 쉘을 실행시키고 있었다. 그리고 callMeMaybe의 주소는 0x400606이라는 것도 알아냈고, 따라서 우리에게 남은 것은 s버퍼부터 리턴 주소 사이의 거리를 계산하는 것이다. 일단, 이 두가지 정보로 s가 ebp-0x110에 저장돼있다는 걸 알 수 있고, 64비트이므로 sfp가 8바..

system hacking 2022.09.14

Layer7 포너블 1차시 문제 풀이 - bof_basic

일단 문제를 받고 ida로 열어보았다. 이런 식의 코드가 나왔는데, s를 오버플로우시켜 v5를 0xDEADBEEF로 변조시켜야하는 문제였다. 그래서 s의 길이(40)만큼 아무 문자로 채우고, p32(0xDEADBEEF)를 보내 v5 변수를 덮으면 if문이 활성화돼 쉘이 실행된다. 따라서 익스플로잇 코드는 이렇게 짜면 된다. from pwn import * p = remote("pwn.scalart.me", 8001) p.send(b'A'*40+p32(0xDEADBEEF)) p.interactive() 이렇게 짜고 python3 명령어로 실행시키면 쉘이 실행될 것이고, whoami 명령어를 실행시키면 권한이 bof_basic으로 바뀐 것을 알 수 있다. 그 후, /home/bof_basic으로 이동해 fl..

system hacking 2022.09.14

해커스쿨 lob 1단계 (gate - gate)

- 코드 분석 int main(int argc, char *argv[]) { char buffer[256]; //크기가 256인 char형 배열 buffer 선언 if(argc < 2){ //프로그램에 전달된 인자의 개수가 2이상이라면 printf("argv error\n"); //에러를 출력하고 프로그램 종료 exit(0); } strcpy(buffer, argv[1]); //프로그램에 전달된 첫 번째 인자를 buffer에 복사 printf("%s\n", buffer); //버퍼 출력 } 요약 : "실행 시 전달된 인자를 출력하는 프로그램" 취약점 : "strcpy 함수에서 인자로 전달된 문자열을 길이제한을 걸지 않고 메모리에 모두 복사해버리기 때문에 다른 메모리 영역을 침범할 수 있다" - 페이로드를..

system hacking 2022.04.09