- Регистрация
- 31.12.2019
- Сообщения
- 7,535
- Реакции
- 36
Привет форумчане. Рад что тут такой интересный конкурс, решил и я кое чем поделится
Думаю вам будет интересно почитать,может кто-то возмет на вооружение и добьется большего.
В статье описано 2 метода
1. как создать смарт контракт с адресом похожим на любой другой (пригодится для создания фейковых смарт контрактов)
2. генерируем ключи,адреса
Идея генерировать миллионы новых адресов,или создать смарт контракт с адресом например схожим на адрес какого-нибудь ICO проекта зародилась у меня еще в конце 2018 года.
Часть 1
Этот метод будет на руку тем,кто занимается фишингом в сфере крипты.
Задумывались ли вы когда нибудь как вообще создается адрес в сети эфириум?
А как создается адрес смарт контракта?
Не буду слишком глубоко вникать в теорию,приводить формулы и показывать график эллиптической кривой и тд.
Если коротко,то любой смарт-контракт, в сети Ethereum имеет уникальный адрес.
На первый взгляд адрес смарт-контракта выглядит случайным, но на самом деле адрес смарт-контракта– это хеш адреса отправителя транзакции и значения nonce (nonce это число исходящих транзакций с этого адреса)
Формула : deployed_address = sha3(rlp.encode([sender, nonce]))
Если кратко, то например адрес DAI Stablecoin в сети эфириум это - 0x6b175474e89094c44da98b954eedeac495271d0f
Ок, попробуем создать смарт контракт с похожим адресом
Сначала скрипт генерирует приватный ключ
Дальше, из этого ключа создается адрес (это еще не адрес смарт контракта,а просто обычный адрес,назовем его для простоты адресом кошелька)
Далее,как мы получаем смарт контракт с нужными символами в начале и в конце адреса?
Получилось следующее
Ключ 4625ce80606d3fc31566894ce39a5121356666b9ca3a41ff06bf68f18a4f859a
Адрес 0x5162cb8d3dd3a93b1358e35832fd5fe402858075
Nonce 7
У нас есть приватный ключ,импортируем его в метамаск.
Теперь у нас есть нужный эфириум адрес.
Nonce свежегенерированного адреса равен 0,в данном случае нам нужно чтобы он был равен 7,чтобы получить нужный адрес.
Просто вручную с этого адреса 6 раз отправляем на наш другой адрес немного эфира (хоть 0.0000000000001).да это затратно,но nonce по другому невозможно искусственно повысить,для того и я указал в скрипте что максимальное значение nonce я ставлю 10
После того как мы сделали 6 транзакций идем на https://remix.ethereum.org/
Это код простого смарт контракта,который принимает эфир,а также дает возможность вывести эфир и токены со своего баланса
Заливаем смарт контракт в сеть.Смотрим чтобы injected address был тот который мы сгенерировали, иначе с другого адреса получится смарт контракт с другим адресом.
Жмем Deploy
Enable optimisation я не выбрал галочку
Жмем на Verify and Publish чтобы смогли взаимодействовать с контрактом
Указываем данные так как на Remix (тип компиляции 1 файл,версия компилятора та же что и была выбрана на Remix,без лицензии)
Попадаем на след страницу.Сюда копируем и вставляем код смарт контракта
Если все сделано правильно то контракт будет успешно задеплоен,о чем увидите соответствующую надпись и пройдя по адресу смарт контракта увидите поля для работы с функциями
Сгенерированный смарт контракт
https://kovan.etherscan.io/address/0x6b1efdd7340dd248b166c8e656117f345c2c5e0f
А это адрес реального DAI https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f
Как видите спереди 0x6b1 и в конце 0f схожи. Если запустить скрипт на каком либо VPS сервере и на более долгое время,то одинаковых символов можно найти больше (так как пишу статью и делаю скрины,то пришлось довольствоваться малым количеством символов. В данном случае ушло меньше часа на моем стареньком Lenovo 2012г)
Другие сгенерированные адреса
Адрес Compound https://etherscan.io/address/0xc00e94cb662c3520282e6f5717214004a7f26888
Фейк
https://kovan.etherscan.io/address/0xc0050568448f885bd9773d254d3ab200c4fa7888
Адрес tokena Uniswap (uni)
https://info.uniswap.org/#/tokens/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984
Фейк
https://kovan.etherscan.io/address/0x1f9f5f873fb7f50ddc5ca8b096a25eaaf1e64984
Настоящий адрес токена USDC https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
фейк: 0xa091a4bb56e72431cd8559acaa0407f230e13b48
Можно создать несколько js файлов чуть откорректировав строки,где надо указать какие символы хотите получит в конце и в начале и можно запустить параллельно несколько окон
Часть 2
Этот скрипт просто генерирует адрес и проверяет есть ли в нем баланс
Спасибо за чтение,думаю кому то реально поможет
Автор: dobush
Думаю вам будет интересно почитать,может кто-то возмет на вооружение и добьется большего.
В статье описано 2 метода
1. как создать смарт контракт с адресом похожим на любой другой (пригодится для создания фейковых смарт контрактов)
2. генерируем ключи,адреса
Идея генерировать миллионы новых адресов,или создать смарт контракт с адресом например схожим на адрес какого-нибудь ICO проекта зародилась у меня еще в конце 2018 года.
Часть 1
Этот метод будет на руку тем,кто занимается фишингом в сфере крипты.
Задумывались ли вы когда нибудь как вообще создается адрес в сети эфириум?
А как создается адрес смарт контракта?
Не буду слишком глубоко вникать в теорию,приводить формулы и показывать график эллиптической кривой и тд.
Если коротко,то любой смарт-контракт, в сети Ethereum имеет уникальный адрес.
На первый взгляд адрес смарт-контракта выглядит случайным, но на самом деле адрес смарт-контракта– это хеш адреса отправителя транзакции и значения nonce (nonce это число исходящих транзакций с этого адреса)
Формула : deployed_address = sha3(rlp.encode([sender, nonce]))
Если кратко, то например адрес DAI Stablecoin в сети эфириум это - 0x6b175474e89094c44da98b954eedeac495271d0f
Ок, попробуем создать смарт контракт с похожим адресом
Сначала скрипт генерирует приватный ключ
Код:
function randstr(){
var chars='0123456789abcdef';
var strlen=64;
var randomstr='';
for(var i=0;i<strlen;i++){
var rnum=Math.floor(Math.random()*chars.length);
randomstr+=chars.substring(rnum,rnum+1);
}
return randomstr;// это рандомно сгенерированный приватный ключ
Дальше, из этого ключа создается адрес (это еще не адрес смарт контракта,а просто обычный адрес,назовем его для простоты адресом кошелька)
Код:
var priv=randstr();
var generatorpoint=ec.g;
var pubkeycord=generatorpoint.mul(priv);
var x=pubkeycord.getX().toString('hex');
var y=pubkeycord.getY().toString('hex');
var publickey=x+y;
var hashpublic=keccak256(new Buffer.from(publickey,'hex'));
var adr=new Buffer.from(hashpublic,'hex');
adr=adr.slice(-20).toString('hex');
adr='0x'+adr;// это будет адрес сгенерированный из нашего приватного ключа
Далее,как мы получаем смарт контракт с нужными символами в начале и в конце адреса?
Код:
for(var i=0;i<10;i++){
/*
Я тут указал значение максимального nonce 10,больше указывать смысла нет,потому что при деплое в сеть смарт контракта нам нужно будет вручную увеличивать nonce у отправляющего адреса. Ниже подробно напишу об этом
*/
var nonce=i;
nonce=nonce.toString();
if(nonce=='0'){nonce='0a';}
var hex=converter.decToHex(nonce);
var sender = adr;
sender=sender.toString();
var input_arr = [ sender, hex ];
var rlp_encoded = rlp.encode(input_arr);
var contract_address_long = keccak('keccak256').update(rlp_encoded).digest('hex');
var contract_address = contract_address_long.substring(24);
contract_address = '0x'+contract_address;
contract_address=contract_address.toString();
var cont_adr_cut_front=contract_address.substring(0,5); // substring(0,5 )если хотим чтобы спереди было например 5 нужных нам символов, а если 4 то указываем substring(0,4) тд
cont_adr_cut_front=cont_adr_cut_front.toString();
var cont_adr_cut_back=contract_address.substring(40,42); // с конца получим 2 нужных символа
//а если хотим например чтобы было 4 символа то указываем substring(38,42)
cont_adr_cut_back=cont_adr_cut_back.toString();
console.log(''+cont_adr_cut_front+' '+cont_adr_cut_back+'');
if(cont_adr_cut_back=='0f' && cont_adr_cut_front=='0x6b1'){ // указываем тут какие символы хотим вначале и сзади
console.log('Найдено'+cont_adr_cut_back);
var alldata='generated key: '+priv+' generated address: '+adr+' nonce: '+nonce+' nuzhniy contract: '+contract_address+'\r\n';
ms.push(alldata);
fs = require('fs');
fs.writeFile('Gener-adr2.txt', ms, function(err){ // запишем все в текстовый файл (приватный ключ,сгенерированный адрес,nonce и адрес будущего сгенерированного смарт контракт)
if (err) return console.log(err);
});
} //else {console.log('NO '+nonce+'');}
} //for
Получилось следующее
Ключ 4625ce80606d3fc31566894ce39a5121356666b9ca3a41ff06bf68f18a4f859a
Адрес 0x5162cb8d3dd3a93b1358e35832fd5fe402858075
Nonce 7
У нас есть приватный ключ,импортируем его в метамаск.
Теперь у нас есть нужный эфириум адрес.
Nonce свежегенерированного адреса равен 0,в данном случае нам нужно чтобы он был равен 7,чтобы получить нужный адрес.
Просто вручную с этого адреса 6 раз отправляем на наш другой адрес немного эфира (хоть 0.0000000000001).да это затратно,но nonce по другому невозможно искусственно повысить,для того и я указал в скрипте что максимальное значение nonce я ставлю 10
После того как мы сделали 6 транзакций идем на https://remix.ethereum.org/
Это код простого смарт контракта,который принимает эфир,а также дает возможность вывести эфир и токены со своего баланса
Код:
pragma solidity 0.5.17;
interface erc20_token{
function transfer(address _to, uint256 _value) external returns (bool);
}
contract Exploit {
string public name;
address owner;
mapping(address => uint256) balances;
constructor() public {
owner = msg.sender;
name='FORUM exploit.in/topic/187486/';
}
function() external payable {}
// vivod ETH
function withdraw_eth(address payable _kuda) public {
require(owner == msg.sender);
_kuda.transfer(address(this).balance); // vidod vsego ETH s balansa
}
// vivod ERC20 tokenov
function withdraw_erc20(uint256 _val,address token_adr,address _komu) public{
require(owner == msg.sender);
erc20_token(token_adr).transfer(_komu,_val); }
}
Заливаем смарт контракт в сеть.Смотрим чтобы injected address был тот который мы сгенерировали, иначе с другого адреса получится смарт контракт с другим адресом.
Жмем Deploy
Enable optimisation я не выбрал галочку
Жмем на Verify and Publish чтобы смогли взаимодействовать с контрактом
Указываем данные так как на Remix (тип компиляции 1 файл,версия компилятора та же что и была выбрана на Remix,без лицензии)
Попадаем на след страницу.Сюда копируем и вставляем код смарт контракта
Если все сделано правильно то контракт будет успешно задеплоен,о чем увидите соответствующую надпись и пройдя по адресу смарт контракта увидите поля для работы с функциями
Сгенерированный смарт контракт
https://kovan.etherscan.io/address/0x6b1efdd7340dd248b166c8e656117f345c2c5e0f
А это адрес реального DAI https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f
Как видите спереди 0x6b1 и в конце 0f схожи. Если запустить скрипт на каком либо VPS сервере и на более долгое время,то одинаковых символов можно найти больше (так как пишу статью и делаю скрины,то пришлось довольствоваться малым количеством символов. В данном случае ушло меньше часа на моем стареньком Lenovo 2012г)
Другие сгенерированные адреса
Адрес Compound https://etherscan.io/address/0xc00e94cb662c3520282e6f5717214004a7f26888
Фейк
https://kovan.etherscan.io/address/0xc0050568448f885bd9773d254d3ab200c4fa7888
Адрес tokena Uniswap (uni)
https://info.uniswap.org/#/tokens/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984
Фейк
https://kovan.etherscan.io/address/0x1f9f5f873fb7f50ddc5ca8b096a25eaaf1e64984
Настоящий адрес токена USDC https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
фейк: 0xa091a4bb56e72431cd8559acaa0407f230e13b48
Можно создать несколько js файлов чуть откорректировав строки,где надо указать какие символы хотите получит в конце и в начале и можно запустить параллельно несколько окон
Часть 2
Этот скрипт просто генерирует адрес и проверяет есть ли в нем баланс
Код:
const http = require('http');
const hostname = 'localhost';
const port = 3000;
// packages
const rlp = require('rlp');
const keccak = require('keccak');
var converter = require('hex2dec');
const EC=require('elliptic').ec;
const ec=new EC('secp256k1');
const keccak256=require('js-sha3').keccak256;
const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/fa58565ce17d44628a6b20e5134*****")); укажите тут свой API токен от Infura
var ms=new Array();
setInterval(function()
{
//random string for privatekey
function randstr(){
var chars='0123456789abcdefABCDEF';//символы для создания ключа
var strlen=64;
var randomstr='';
for(var i=0;i<strlen;i++){
var rnum=Math.floor(Math.random()*chars.length);
randomstr+=chars.substring(rnum,rnum+1);
}
return randomstr;//this is returned privatekey
}
var priv=randstr();
var generatorpoint=ec.g;
var pubkeycord=generatorpoint.mul(priv);
var x=pubkeycord.getX().toString('hex');
var y=pubkeycord.getY().toString('hex');
var publickey=x+y;
var hashpublic=keccak256(new Buffer.from(publickey,'hex'));
var adr=new Buffer.from(hashpublic,'hex');
adr=adr.slice(-20).toString('hex');
adr='0x'+adr;
ms.push('\r\n');
ms.push(priv,adr);
web3.eth.getBalance(adr, function(err, result) {
if (err) {
console.log(err)
} else {
var balance=web3.utils.fromWei(result, "ether");
ms.push(balance);
console.log('address: '+adr+ ' balance: '+balance+' ETH')
//Запишем в текстовый файл если нашли баланс
if(balance>0.001){
fs = require('fs');
fs.writeFile('naydenbalans.txt',ms,function(err){
if (err) return console.log(err);
});
}
}
})
},1000); // генерация адреса каждую секунду
Спасибо за чтение,думаю кому то реально поможет
Автор: dobush