bof 문제를 풀어보장. overflowme 배열 32 byte를 받았다.그리고 get함수로 overflowme 배열을 입력받고,key 값이 0xcafebabe이면 쉘을 실행한다.key는 main에서 입력받은 0xdeadbeef이다. gdb를 보면 main+3에서 72만큼 스택을 확장했고,main+24가 printf함수 인것 같다.main+35가 gets함수라고 생각해보면 main+29에서 ebp-0x2c부분이 overflowme배열의 위치인 것 같다. 그럼 ebp-44이다. 배열이 32바이트 였는데 44니까 12만큼 dummy가 있겠다.그리고 main+40에서 0xcafebabe와 비교되는 ebp+8이 key의 위치이겠다. 그럼 배열[44]+main의 sfp[4]+main의 ret[4]=52만큼 스택을..
col 문제를 풀어보장. argc > 2 여야 하고,argv[1]의 길이는 20이여야 한다고 한다.hashcode == check_password(argv[1])이면 flag를 보여준다. check_password함수를 보니 문자열 포인터 p를 받아 int 포인터형으로 형변환을 해 포인터 ip에 저장한다.그리고 ip[0]~ip[4]까지 모두 더해 res값을 리턴. 왜 0~4인지 생각해보니 문자열->int형 형변환 때문이다."AAAABBBBCCCCDDDDEEEE"->"AAAA" "BBBB" "CCCC" "DDDD" "EEEE"문자열은 1바이트 단위 이지만 int형은 4바이트 단위라서 20바이트가 4*5 바이트로 나뉜것이다.그래서 5번을 더해준것이고. 그럼 거꾸로 생각해보면 0x21DD09EC를 5로 나눈 ..
fd 문제를 풀어보장. buf[32]로 버퍼를 할당해 주었고,if문으로 argv를 2개 이상 넣어줘야 한다고 조건을 줬다. fd값은 argv[1]의 값을 정수로 바꿔준 뒤 0x1234값을 뺀 값으로 했다.read()함수로 fd파일을 열어 32바이트 만큼 buf에 넣어준다. 그리고 buf의 값이 LETMEWIN이랑 비교해 같으면 문제가 풀린다고 한다. https://watchout31337.tistory.com/140?category=773356 이 글을 참조해보면fd 값이 0일 때 값을 입력할 수 있다. 즉 argv[1] - 0x1234가 0이면 fd값이 0으로 설정되어 fd 파일에 입력을 할 수 있다.0x1234 = 4660이니 이렇게 풀수 있겠다.
bugbear를 풀어보장. 엄청 복잡해보인다. 천천히 보면FILE *fp;로 파일명을 받을수 있는 파일 포인터를 만들었고,여기에 popen(ldd assassin | grep libc | awk'{print $4"}') 이런 파일을 넣었다.assassin파일의 공유 파일중 libc가 들어있는 파일의 4번째 라인을 열겠다는 것 같다.그리고 fgets로 buffer에 저장하고,sscanf로 buffer의 값을 lib_addr에 넣는다. 다시popen(nm libc.so.6 | grep __execve | awk '{print $1}')을 fp에 넣어주고execve_offset에 넣었다. 그리고 execve_addr은 lib_addr+execve_offset이라고 한다.이걸 직접 계산해봤는데 그냥 함수에서 e..
execve 함수에 대해 알아보자. int execve(const char *filename, char *const argv[], char *const envp[]);파일이름 파일인자의 포인터 환경변수의 포인터 execve는 filename이 가리키는 파일을 실행한다. 이 파일은 바이너리 실행파일이거나 스크립트 파일이여야 한다. argv와 envp는 포인터 배열로 filename의 인자로 들어간다. 마지막에 NULL문자열을 저장해야 한다. 위 코드는 /bin/sh를 실행시키는 코드다. 실행하면 이렇게 쉘이 실행되는걸 볼수 있다.
다크나이트를 풀어보장. RTL이라는 힌트를 줬다.나머지 조건들은 비슷하다.48번째 인자가 /xbf이면 안된다고 한다는게 다르다.즉, 스택의 값을 사용할 수 없다. 익스플로잇 구성은 buffer+system의 주소+4바이트+/bin/sh이 되겠다. RTL을 사용하기 위해 system함수의 주소를 찾아보자. 0x40058ae0이 system함수의 주소이다. /bin/sh의 값을 찾아보자. 코드를 짜준 후 실행해 보면 0x400fbff9로 /bin/sh의 값을 구할 수 있다. 익스플로잇하면 답이 나온다.
golem을 풀어보장. main함수가 있고 problem_child함수를 이용해 argv[1]을 인자로 전달하고, strncpy함수는 이를 buffer에 복사한다. 근데 strncpy함수에서 이상하게 41바이트를 복사한다. buffer크기는 40바이트인데. FPO라고 힌트를 줬다.FPO란 Frame Pointer Overflow의 줄임말이다. SFP overflow나 1byte overflow라고도 불린다. FPO를 알기전에 함수의 에필로그인 leave와 ret명령어를 제대로 이해 해야한다.leave 명령어는 move $esp,$ebppop $ebp두개 명령을 줄인 것이다. mov $esp,$ebp 명령어로 현재 함수의 SFP시작위치에 있는 ebp와 스택 끝자락에 있던 esp를 같은 위치에 둔다.pop ..
skeleton을 풀어보장. 시작하기 전에 꼭 bash2로 쉘을 바꿔주자. 이번 문제를 보면 stack destroyer가 추가되었다.memset으로 buffer의 시작부터 44개를 0으로 만들고,buffer+48부터 0xbfffffff까지 모두 0으로 만들어버리는 무시무시한 방법이다.이럼 우리는 argv는 손도 댈수 없다.이럴 땐 어떻게 해야할까...buffer보다 낮은 주소공간을 이용해야 한다. 여기서부터는 베이스지식이 필요하다.바로 LD_PRELOAD 환경변수이다. 간단히 설명하면프로그램을 실행하면 같이 실행되는 환경변수이다. 기본적으로 들어있지 않지만 export로 설정해 줄수 있다. 이제 공유 라이브러리에 들어갈 파일을 만들어주자. 아무것도 없는 lib.c를 만들어준 후, so파일로 컴파일 해준..
vampire를 풀어보장. 이번엔 아예 모든 argv를 막았다... orge 문제를 풀 때 환경변수의 argv[0]값이 초기화 되지 않았던걸 확인했다.이번에도 그런지 확인해보자. 먼저 스택을 보자. 48만큼 스택을 확장했다. buffer40,i 40, saved_argc 4 만큼 딱 맞게 스택이 확장되었다. 모든 초기화를 끝낸 다음인 leave에 break문을 걸고, buffer를 채운다. 환경변수 부분을 확인해 보면 아직 남아있는게 확인된다. 그럼 orge때 처럼 이름을 nop+shell로 구성해서 익스플로잇을 할수 있겠다. 일단 nop+shell파일을 만들자. 쉘코드는\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\xc2\x01\x01\x01\x01\x52\xb9\x2e\x62\x6..
- Total
- Today
- Yesterday
- 머신러닝
- 차량 네트워크
- 논문 잘 쓰는법
- problem statement
- CAN-FD
- AVTP
- 차량용 이더넷
- 크로스 엔트로피
- SOME/IP
- AE
- 회귀
- porks
- automotive
- cuckoo
- one-to-many
- 케라스
- SVM
- Python
- many-to-one
- 로지스틱회귀
- Ethernet
- 딥러닝
- many-to-many
- PCA
- AVB
- automotive ethernet
- HTML
- json2html
- 이상탐지
- 단순선형회귀
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |