assassin.c를 assassi1.c로 복사 후, dumpcode를 넣고 memset이후에 출력하도록 한 후 assassi1로 컴파일한다.
ret에만 브레이크포인트를 걸고 gdb로 살펴보면
로 ret이 0x8048780위치로 나온다. ret에 브레이크포인트를 걸고, 인자로 a 48개를 주고 실행해보자.(ret까지 덮어씌운다.)
덮어씌워진 ret가 보이며 esp에 ret의 주소가 aaaa로 덮어씌워진걸 확인할수있다. 그런데 esp에 aaaa대신 ret주소를 한번 더 넣으면 ret을 한번 더 참조하게 된다고 한다. 왜냐하면 ret은 어셈블리어로 pop eip, jmp ip이다. 그러므로 eip의 주소를 덮어씌워주면 jmp eip로 인해 eip로 가기 때문이다.
아마도 저 주소가 현재 ret의 주소라서 그런것 같다. 확실하지는않음. 아래는 실험 결과이다. esp 주소의 값을 계속 eip값으로 바꿔주면 계속 한번씩 더 참조한다.
브레이크포인트를 따로 건것도 아닌데 다시 돌아와서 esp의 주소를 참조한다. 그런데 여기서 살펴보면esp의 값이 계속 4씩 증가함을 알 수 있다. 한번 참조할때마다 esp+4의 주소값을 참조하게된다. 문제 조건이 특정 위치에만 rtl, argv[1]을 못쓴다. (argv[1][47]이 "\xbf","\x40"이면 안됨.) 그러면 4바이트 뒤로 가서 쓰면 된다. 위의 트릭으로 4바이트 뒤로 간 뒤에 system("/bin/sh")로 쉘을 실행해보자. 일단 내부의 ret주소를 알려면 다시 컴파일해야한다. 컴파일시 원래의 assassin.c소스로 아무거나 하나 만든다. 그 후에 gdb로 ret주소를 확인한다.(위에 우리가 예시로 만들었던 실행파일은 dumpcode등으로 ret주소가 다르기때문에 assasi1로는 성공해도 assassin으로는 성공을 못할수도 있다.)
ret를 찾아보면 0x804851e일것이다. 이 주소를 대상으로 공격하면된다.
buffer~sfp |
ret |
ret+4 |
ret+8(system함수의 ret) |
ret+12 |
아무거나 44개 |
ret주소. |
system함수 주소 |
아무거나 4개 |
/bin/sh문자열 주소 |
./assassi1 `python -c 'print "a"*44+"\x1e\x85\x04\x08"+"\xe0\x8a\x05\x40"+"aaaa"+"\xf9\xbf\x0f\x40"'` 로 하면 성공을 확인할수 있다.
그럼 이제 assassin에 저대로 공격하면 된다.
'systemhacking > practice' 카테고리의 다른 글
lob zombie_assassin->succubus (0) | 2015.01.29 |
---|---|
lob assassin->zombie_assassin (fake ebp) (0) | 2015.01.28 |
lob bugbear->giant (rtl2) (0) | 2015.01.26 |
lob darkknight->bugbear (0) | 2015.01.22 |
lob golem->darkknight (1바이트변조) (0) | 2015.01.21 |