systemhacking/practice

lob giant->assassin

qkqhxla1 2015. 1. 27. 17:07

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