일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 인공지능
- leg
- 기능개발
- logistic regression
- Algorithm
- Softmax classification
- pwnable.kr
- 텐서플로
- Python
- Linear_regression
- programmers
- AI
- tensorflow
- Today
- Total
목록pwnable/pwnable.kr (9)
나혼자 공부장
/* input.c */ #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0; p..
key 와 random 값을 서로 XOR 연산 했을 때 0xdeadbeef 가 되도록 key를 입력해주면 되는 문제이다. 여기서 rand()는 seed를 두고 있는 랜덤이 아니기 때문에 말이 랜덤이지 계속 같은 값을 가지게 된다. 그럼 랜덤 값이 뭔지 알아내기만 하면 끝나는 문제겠다. rand() 함수값이 할당이 된 이후에 break point 를 걸고 random 값이 무엇인지 찾아보았다. random address : 0x6b8b4567 key는 정수형으로 받고 있으니 10진수 타입으로 입력해주면 된다. 아래 접은 글은 flag문을 포함하고 있다. 더보기 flag : Mommy, I thought libc random is unpredictable...
passcode 실행파일의 코드이다. 찬찬히 읽어보며 취약점을 찾아보자. 일단 코드의 로직을 살펴봤을 때, passcode1의 값이 338150이거나 passcode2의 값이 13371337이면 flag를 보여준다. 그럼 저 stdin으로 조건문에 부합하도록 입력해주면 끝나는거 아닌가? 싶었지만, login() 함수 속 scanf() 구문을 잘 보면, 우리가 옳다고 여기는 형태와 조금 다르다. scanf("%d", passcode1); 무엇이 다른가 하면, &이 붙고 안 붙고의 차이가 있다. 한 마디로 passcode1의 주소값이냐 value냐인데, 우리가 아는 형태로는 주소값으로 받아야 우리가 원하는 변수에 입력값이 제대로 할당이 된다. 그렇다면 passcode.c 에서 제시된 입력 구문대로 하면 컴퓨..
일단 첫인상은 ARM 아키텍처를 사용하는 것으로 보여진다. 쓰여진 링크들을 모두 다운받아 내용을 확인해보자. 다운받은 파일 중 leg.c 라는 소스 파일을 열어보면, 위와 같은 코드가 보여진다. 코드로만 봤을 때는, key1() + key2() + key3() 의 값을 사용자가 계산하여 stdin을 통해 입력해주면 풀리는 문제라고 보여진다. asm 함수에 따로 리턴 타입이 있는지 조사해봤으나 그런 것 같지는 않았다. 다운받은 파일 중 leg.asm을 열어 더 자세하게 살펴보자. 여기까지 봤을 때 파악할 수 있는건, 각 함수의 값은 r0 에 담겨서 전달되고 있다는 것이다. 이는 우리가 이제 각 함수마다 r0 값이 최종적으로 무엇인지 파악해야 한다는 것을 의미한다. 1. key1 key1 부터 보면, r0에..
파일을 다운받아서 IDA로 뜯어보자. 오 빨간 줄이 뜬다. String 확인해보자 upx 로 패킹 되어 있다고 한다. 언패킹 툴 다운 받아서 flag 파일의 압축을 풀어주자. 그리고 다시 IDA로 flag 파일을 열어보면 제대로 디스어셈블이 되어있는걸 볼 수 있다. flag 부분을 더블클릭해서 자세히 살펴보면 문자열을 확인할 수 있다. flag : UPX...? sounds like a delivery service :)
일단 위 다운로드 링크들을 linux 환경에서 모두 다운받아 준다. nc 명령어 같은 경우는 지금 당장은 신경쓸 필요 없고, 이후에 결과를 출력할 때 쓰일 것이다. 일단 레벨의 이름이 bof이니 buffer overflow를 이용하는 문제이다. 다운로드 한 소스코드를 열람했을 때 다음과 같은 코드가 보인다. gets로 입력을 받는 부분, 즉 overflow 변수에서부터 오버플로우를 일으켜 main의 func 함수 파라미터로 들어가있는 하드코딩된 문자열을 0xcafebabe로 바꿔주면 된다. 그러나 정확히 어느 정도의 바이트를 오버플로우를 일으켜야 하는지 알기 어려우니 gdb로 자세히 살펴보자. overflow 변수의 위치는 ebp-44 이며, key의 위치는 ebp+8 이다. 그 차이 52 byte 만큼..
위 링크로 ssh 접속해준다. col 파일에 setUID가 걸려있고, col.c를 실행시켜 코드를 분석해보자. 일단 입력값은 20byte여야 하고, check_password 함수를 진행한 결과가 hashcode 값과 같아야 한다. 입력값을 5개로 분할해 모두 더한 결과가 0x21DD99EC 여야 하므로, 임의의 16진수로 16바이트를 채우고, 나머지 4바이트를 (hashcode - 4바이트를 모두 더한 값)으로 지정하면 되겠다. flag : daddy! I just managed to create a hash collision :)
위에 나온 ssh 링크로 접속한다. 파일에 setUID가 걸려있는 fd라는 실행파일이 있고, fd.c 로 코드를 조회할 수 있게 되어있다. 코드를 분석해봤을 때, flag를 띄우려면 사용자가 입력값으로 어떤 정수를 넣어야 해결되는 문제인듯 하다. fd 만큼의 파일 디스크립터에서 32바이트 만의 문자열을 받아 buf에 저장하고, 그게 LETMEWIN\n이 되도록 해야한다. LETMEWIN\n 이 들어있는 파일을 만들까 생각했지만 파일 디스크립터를 따로 지정하는게 곤란하다. 파일 디스크립터 내용 의미 0 stdin 표준 입력 1 stdout 표준 출력 2 stderr 표준 오류 다음과 같이 고정되어 있는 파일 디스크립터 값이 있다. 여기서 stdin을 실행시켜서 문자열을 입력받도록 하고, 그때 LETMEWI..