BOF redhat 원정대 wolfman -> darkelf

BOF redhat 원정대 wolfman -> darkelf

darkelf, darkelf.c


c 코드를 보면 이전 문제에서 argv[1]의 길이를 제한하는 코드가 들어가 있는 것을 알 수 있다.
이전문제에서 buffer를 초기화해주어서 RET 이후에 쉘코드를 넣고 버퍼의 주소로 RET를 덮어서 공격하였는데 이번에는 argv의 길이가 제한되어 있어서 뒤에 쉘코드를 추가 할 수 없다.
RET는 조작할 수 있지만 쉘코드를 올릴 공간을 찾아야한다. argv의 메모리에 쉘코드를 넣으면 된다.
code 내에서 argv를 배열로서 사용할 수 있으므로 분명히 메모리 어딘가에 올라가 있음을 알 수 있다.
argv의 주소를 찾아보자


메인에서 브레이크를 잡고 A 48개, B 24 개를 넣어보았다.
argv[0](darkelf, 6461726b656c66), argv[1], argv[2]가 모두 들어가 있는것을 볼 수 있다.
memset으로 초기화하는 부분은 메인함수의 지역변수인 버퍼 메모리임으로 여기는 초기화되지 않는다.

argv를 출력하는 코드를 작성하여 주소를 확인해보았다.


페이로드를

[버퍼][SFP][RET]..................[argv]
[  쉘코드 ][RET]..................[쉘코드]

구성한다. RET을 argv자리의 쉘코드 주소를 넣는다.
페이로드를 작성하고 공격하면


성공적으로 쉘을 얻을 수 있다.

쉘코드 :
./darkelf `python -c 'print "\x90"*20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x51\xfc\xff\xbf"'`

0 개의 댓글:

댓글 쓰기