문제 파악./prob처음 실행해보면 문자열을 입력 받는거같은데, 조금 이상하다. 뭔가 문자열 혹은 버퍼가 깔끔하게 들어가고 있는 느낌은 아니다. 카나리 없고, PIE 없다. 개꿀. IDA처음 실행하면 16바이트를 입력받고, s1이 Decision2Solve와 같은지 비교한다. read_input은 1바이트씩 반복문을 통해 입력을 받는다.이걸 보고 알 수 있는건, 처음 실행했을 때 이상하게 문자열이 들어가는 느낌이 이것 때문이라는 것을 알 수 있다. 버퍼에 남아있는 값들이 다음 입력으로 넘어가거나,,, 엔터까지 받아버리고 등등,,, 취약점unsafe_func()을 보면 너무 당당하게 bof가 발생하고 있다. 근데 보자마자 조금 쎄한건 0x10000만큼이나 받아버리면... 정상 실행이 가능할까...? 우선 ..
ARM을 공부하라고 한다. 먼저 leg.c와 leg.asm 파일을 다운받았다. 소스코드 분석 leg.c #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (k..
소스코드 기능분석 먼저 main 함수에서 putenv함수로 환경변수를 설정한다. 이때 PATH가 /thankyouverymuch로 바뀌게 된다. 이후 filter 함수에 cmd1 파일을 실행할 때 넘겨준 인자가 넘어가게 되고, strstr에 의해 필터링을 하게된다. 인자에 flag, sh, tmp가 없었다면 system(넘겨준인자)를 실행한다. 익스플로잇 먼저 putenv로 path를 없앤다. printenv로 환경변수를 확인해보면 PATH가 이렇게 설정되어있다. /usr/bin이 기본 path이기에 cat과 같은 명령어를 cat만 쳐도 실행이 되는 것이다. 하지만 path가 사라졌으니 절대 경로를 사용해야한다. 즉 인자로 /bin/원하는 명령 을 넘겨주어야 하는 것이다. 우리가 하고싶은건 flag를 읽..