목록분류 전체보기 (285)
tmxklab

1. 문제확인 nc ctf.j0n9hyun.xyz 3005 1) 접속 이상한(?) 문자열과 buf의 주소 값으로 보이는 문자열이 출력되면서 종료 2) IDA(Pseudocode)확인 - main() puts()를 통해 s변수에 저장된 문자열을 표준 출력으로 보냄 printf()를 통해 main()에서 초기화되지 않고 선언된 v4변수의 주소 값을 출력 gets()를 통해 표준 입력으로 들어온 문자열을 v4에 저장 -> bof 취약점 존재 2. 접근방법 1) 스택구조(main) gets()를 사용하여 bof공격을 통해 ret의 주소 변조가능 v4의 변수에 쉘 코드를 삽입하여 ret의 주소를 v4의 시작 주소로 변경해야함 2) v4의 시작주소 v4의 시작주소를 넣어 보려하지만 실행할 때마다 v4의 주소가 변경..

1. 문제확인 nc ctf.j0n9hyun.xyz 3004 1) 접속 hi를 입력하면 Hello와 함께 출력되면서 종료 2) IDA(Pseudocode)확인 - main() scanf()를 통해 s변수에 입력의 제한없이 문자열을 받음 -> bof 취약점 존재 입력받은 s변수와 "Hello"출력 3) IDA(Pseudocode)확인 - callMeMaybe() main()에서 호출되지 않았으며 호출해야할 함수 2. 접근방법 1) 스택구조(main) 2) 결론 scanf()를 통해 ret의 주소를 callMeMaybe()의 시작주소로 변조 3. 풀이 1) callMeMaybe() 주소 확인 callMeMaybe() 주소 : 0x400606 2) 공격 코드 작성 from pwn import * # pwntoo..

1. 문제확인 nc ctf.j0n9hyun.xyz 3003 1) 접속 Name과 input값을 입력한 뒤 프로그램 종료 2) IDA(Pseudocode)확인 - main() read()를 사용하여 표준입력을 받아 name변수에 50bytes까지 저장 가능 gets()를 통해 표준입력으로 들어온 문자열을 s변수에 저장 gets()에 쓰인 s변수는 main()에서 선언되어 있지만 read()에 쓰인 name변수는 main()에서 찾을 수 없음 ssize_t read(int fd, void *buf, size_t len) - int fd : 파일디스크립터(0, 1, 2는 표준 입력, 표준 출력, 표준 에러) - void *buf : 데이터를 저장할 버퍼 - size_t len : 읽을 데이터 크기 char *..

1. 문제확인 nc ctf.j0n9hyun.xyz 3002 1) 접속 "hi"를 입력하면 출력 값으로 "hi"을 내보내고 프로그램은 더이상 실행되지 않음 2) IDA(Pseudocode)확인 - main() vuln()를 실행하고 종료 3) IDA(Pseudocode)확인 - flag() system() 실행 4) IDA(Pseudocode)확인 - vuln() fgets()를 통해 input값을 s변수에 저장한 뒤 snprintf()를 통해 s변수에 저장된 값을 format변수에 저장 이때, 1024bytes까지 사이즈의 범위를 제한했지만 포맷을 지정하지 않았음 -> FSB 취약점 존재 마지막으로 format변수에 저장된 값을 포맷 지정 없이 printf()를 통해 출력 -> FSB 취약점 존재 int..

1. 문제확인 nc ctf.j0n9hyun.xyz 3001 1) 접속 "hi"를 입력하면 출력 값으로 "하아아아아앙"(?)을 출력하고 프로그램은 더이상 실행안됨 2) IDA(Pseudocode)확인 - main() IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환 char형 s변수는 [ebp-8Ch]이므로 ebp로부터 140bytes만큼 떨어져 있고 void형 v5함수 포인터 변수는 [ebp-Ch]이므로 ebp로부터 12bytes만큼 떨어져 있음 v5변수 선언 후에 sup()함수의 주소를 저장 fgets()로 133bytes만큼의 입력 값을 받음 v5()가 방금 지정한 함수 실행 3) IDA(Pseudocode)확인 - sup() s에 입력된 값을 화면에 출력함 4) IDA(Pseudoco..

1. 문제확인 nc ctf.j0n9hyun.xyz 3000 1) 접속 "hi"를 입력하면 출력 값으로 "[buf] : hi"와 [check] 0x4030201을 출력하고 프로그램은 더이상 실행안됨 2) IDA(Pseudocode)확인 - main() IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환 char형 s변수는 [ebp-34h]이므로 ebp로부터 52bytes 떨어져 있고 int형 v5변수는 ebp로부터 12bytes떨어져 있음 v5변수 선언 후에 0x4030201로 초기화 fgets()로 45bytes만큼의 입력 값을 받아 printf()로 출력함 두 번째 if문에서 v5변수가 초기화시킨 값이 아닌 0xDEADBEEF로 변경되면 system()함수 실행 2. 접근방법 1) 스택 구..

1. 문제확인 1) 사용자 및 패스워드 : level19 / swimming in pink 2) 파일확인 3) hint 코드 설명 main() { char buf20]; gets(buf); printf("%s\n", buf); } gets()를 통해 buf에 사용자의 입력 값을 넣고 printf()로 출력시키는 단순한 코드 gets()로 인해 buf배열의 크기(20bytes)보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 2. 접근방법 1) attackme 디버깅 : gets함수의 인자인 buf가 gets함수 호출하기전에 push하므로 [ebp-40]위치에 buf변수 존재 2) 스택구조 3) 결론 gets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 받을 수 있음 RTL공격기법..

1. 문제확인 1) 사용자 및 패스워드 : level18 / why did you do it 2) 파일확인 3) hint 코드 설명 #include #include #include #include void shellout(void); int main() { char string[100]; // 사용자의 입력받은 문자열을 저장하는 배열 int check; int x=0; // 사용자의 입력을 1byte씩 저장하는 변수 int count=0; // string배열에서 인덱스 역할 fd_set fds; // 파일 디스크립터(fd)를 저장하는 구조체 변수 선언(배열 형태) printf("Enter your command: "); fflush(stdout); // 출력 버퍼를 비움 while(1) { // 밑에 ..

1. 문제확인 1) 사용자 및 패스워드 : level17 / king poetic 2) 파일확인 3) hint 코드 설명 #include void printit(){ printF("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf, 48, stdin); setreuid(3098, 3098); call(); } fgets()로 인해 buf[20bytes]배열의 크기보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 Level16과 달리 shell()가 사라지고 printit()만 존재 2. 접근방법 1) attackme 디버깅 : [ebp-16]에 0x8048490(printit()의 시작 주소..

1. 문제확인 1) 사용자 및 패스워드 : level16 / about to cause mass 2) 파일확인 3) hint 코드 설명 #include // level17 쉘 권한 획득할 수 있는 함수 void shell(){ setreuid(3097, 3097); system("/bin/sh"); } void printit(){ printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; // 함수 포인터call변수가 printit함수의 주소를 가리킴 char buf[20]; fgets(buf, 48, stdin); call(); // printit함수 호출 } shell()은 level17 쉘 권한을 획득할 수 있는 함수이며 print..