전체 글 118

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