passcode : aspirin (NO DRAG, NO PASSCODE) bash2. vampire 프로그램과 소스코드가 있다. 분석해보자. 이번 문제는 shellcode 를 export 해도 된다. shellcode의 주소를 ret 주소에 넣으면 될 것 같다. 하지만 argv[1][46] == '\xff' 이어야 한다. 지금까지의 buffer 주소 및 NOP의 주소는 0xbfffxxxx 의 형태였다. 하지만 이 문제는 그런 주소를 사용하지 못한다. 우선 메모리 구조는 다음과 같다. —————————— High Address | ret(4) | —————————— | sfp(4) | —————————— ← ebp | buffer(40) | —————————— Low Address 따라서 주소를..
passcode : timewalker (NO DRAG, NO PASSCODE) bash2. 바로 소스코드를 살펴보자. 이번에는 argc 까지 제한되어 있다. buffer에 직접 shellcode를 박을 수도 없다. 또한 ret 주소에 shellcode를 export하여 주소를 넣고 싶어도 환경변수를 사용하지 못할 뿐더러 argv[1]이 0으로 초기화 되기 때문에 이는 적절한 방법이 아니다. 따라서 argv[1]는 건드릴 수 없다. 결국 우리는 argv[0]에 shellcode를 넣는 수밖에 없다. argv[0]에는 길이 제한이 없기 때문에 이 shellcode를 여기에 넣으면 될 것 같다. 우선 shellcode를 이용해야 한다. 하지만 지금까지 사용한 shellcode는 /bin/bash 를 기계어로..
passcode : kernel crashed (NO DRAG, NO PASSCODE) bash2 입력. 슬슬 코드가 길어진다. 분석해보자. here is changed 라고 친절히 알려주었다. argv[0]의 길이를 77bytes로 만들어주어야 한다. 프로그램을 실행할 때 argv[0]는 프로그램의 이름에 해당한다. gdb로 분석한 메모리 구조는 다음과 같다. —————————— High Address | ret(4) | —————————— | sfp(4) | —————————— ← ebp | buffer(40) | —————————— | int(4) | —————————— Low Address 이제 buffer 의 주소를 구해보자. 따라서 buffer의 주소는 0xbffffbf1 이..
passcode : love eyuna (NO DRAG, NO PASSCODE) bash2. 바로 소스코드 분석하자. 이번에는 orc 문제와 다르게 buffer 에 값을 넣을 때 길이 검사도 한다. strcpy는 공백도 복사하기 때문에 이를 이용하여 문제를 해결할 수 있다. argv[1] 뒤에 NOP Sled 와 shellcode 를 이어붙이지 못하니 argv[1] 뒤에 공백을 두어 argv[2], 즉 인자를 추가로 하나 더 부여하여 buffer와는 다른 메모리 영역에 NOP Sled 와 shellcode가 존재하도록 하자. 우선 gdb를 이용하여 분석한 메모리 영역은 다음과 같다. —————————— High Address | ret(4) | —————————— | sfp(4) | —————————— ..