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..
다크나이트를 풀어보장. 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..
orge를 풀어보장.어려웡...혼자풀기에는 어려워서 풀이를 봤다.풀이보면서 어떻게 푸는건지 감 잡은 다음, 블로그에 혼자 풀면서 정리해서 올렸다. 또 추가됐다. argc, 즉 인자의 개수는 2개여야 하고, argv[1]을 0으로 초기화 해버린다.그럼 우리는 argv[1]도 못쓰고, argv[2]도 못쓴다....남은건 argv[0]이다. 원래는 argv[0]에 파일이름을 넣었다. ./orge처럼근데 이번엔 ./orge 대신 ./\x~~~~ 같이 쉘코드를 넣을거다.그럼 argv[0]의 위치를 알아낸 후 ret를 argv[0]의 위치로하면 쉘이 실행되겠지? 그럼 일단 쉘코드 이름을 가진 파일을 만들어보자.이름은 nop sled를 타기위해 nop과 쉘코드로 구성한다.여기서 쉘코드는 /이 없어야 한다. 왜냐하면 ..
darkelf를 풀어보장. 또 비슷한데 하나만 추가되었다. //here is changed! 해서 argv[0]의 길이가 77이여야 한다고 한다. argv[0]이면 ./orge에 해당하는 부분인데 이 길이를 77로 맞춰줘야 한다.어떻게 할까. 1. ......................../orge 하는 방법2..//////////////////../orge로 하는 방법3. ./aaaa..aorge로 하는 방법 첫번째와 세번째는 안되니까 두번째로 하자. 익스플로잇은 그냥`python -c 'print"."+"/"*72+"orge"'`로 하면된다. 나머지는 wolfman과 똑같은거 같다.
wolfman을 풀어보장. c파일을 확인해보니 별걸 다 막는다. 일단 buffer를 40만큼 할당했고,i가 있다. orc에서 추가 된건 argv[1]의 길이가 48보다 크면 안된다느 점이다.여태 우리가 썼던 방식으로는 못푼다. 해결방법은 argv[2]를 쓰면된다. gdb를 보자. 44만큼 스택을 확장했고, buffer의 위치는 ebp-40이다. 이제 argv[2]를 사용하는 방법을 생각해보자.평소에 우리가 사용하는 익스플로잇에서 ./orc가 argv[0]이였고, `python~~~`여기가 argv[1]이였다.그럼 argv[1]다음에 공백을 하나 주고 값을 주면 argv[2]가 들어가지 않을까? 이렇게 공백을 줄수 있다. 값이 들어갔는지 확인을 해보면 argv[2]의 값인 0x42까지 잘들어갔다. 그럼 a..
orc를 풀어보장. c파일을 보면 goblin과 비슷한데 buffer hunter가 추가되었다.buffer의 값을 모두 0으로 만든다.goblin때도 buffer는 사용하지 않고 풀었으니 상관없을 것 같다.buffer 40만큼 할당하고, i가 존재하고,strcpy로 값을 받아준다. 똑같이 풀어보자. gdb에서 buffer의 위치를 확인해보면 스택이 44만큼 확장되었다.왜냐하면 i도 똑같이 있기 때문이다. 그럼 40만큼 buffer할당하고 4만큼 sfp할당하면 44에서 ret이 시작된다.그리고 47번째 인덱스가 \xbf여야한다고 했다. 그럼 값을 넣어서 argv[1]의 위치를 찾아보자. 입력값을 받은 직후에 break문을 걸어주고, 값을 넣어주었다. 들어가는 값을 확인해보니buffer와 argv[1]의 위..
- Total
- Today
- Yesterday
- AE
- 크로스 엔트로피
- 논문 잘 쓰는법
- SVM
- 차량 네트워크
- 로지스틱회귀
- many-to-many
- Python
- 머신러닝
- SOME/IP
- PCA
- AVB
- 케라스
- automotive ethernet
- cuckoo
- CAN-FD
- json2html
- 차량용 이더넷
- automotive
- AVTP
- 딥러닝
- many-to-one
- 단순선형회귀
- one-to-many
- 회귀
- 이상탐지
- HTML
- problem statement
- Ethernet
- porks
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |